cwLeeDev commited on
Commit
ddda67c
·
verified ·
1 Parent(s): 4dee47b

Document rejected affine ablation and resumable federation training.

Browse files
MANIFEST.json CHANGED
@@ -1,11 +1,11 @@
1
  {
2
- "schema": "aiflow-hf-research-snapshot-v28",
3
- "generated_at": "2026-07-24T19:51:10.441196Z",
4
  "track": "R_noncommercial_plus_rejected_P_proxy",
5
  "product_validation": false,
6
  "public_release": true,
7
  "contains_raw_dataset": false,
8
- "tests": "367 Python passed + 8 Android passed",
9
  "retracted_paths": [
10
  "models/auxiliary/boundary_auxiliary_head.pt",
11
  "models/auxiliary/seed17/boundary_joint_delta.pt",
@@ -153,6 +153,26 @@
153
  "bytes": 8414,
154
  "sha256": "5ba2955961ad74b4eeef146f4dcc4fa7bc9438a0e6e3840468bdf611c758607c"
155
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  {
157
  "path": "models/research_formula_adapter/seed17/formula_adapter.pt",
158
  "bytes": 92162,
@@ -225,13 +245,13 @@
225
  },
226
  {
227
  "path": "README.md",
228
- "bytes": 25971,
229
- "sha256": "e90002b2403aa23a4d8c525f7251bc098fcfff5520d73f5dd1b65f805b721afa"
230
  },
231
  {
232
  "path": "registry/math_ink_06_source_registry.json",
233
- "bytes": 22774,
234
- "sha256": "c03ebc21a796109c70e200d96ee8e01ce465578ee891467ef1f08aeb93baefed"
235
  },
236
  {
237
  "path": "reports/behavior_exact_gate_3seed.json",
@@ -278,6 +298,11 @@
278
  "bytes": 2949,
279
  "sha256": "5f724d7eef306b54f7b1d110f1d5c738d3d9985cd9aa3bdb1aff3478d2e1e647"
280
  },
 
 
 
 
 
281
  {
282
  "path": "reports/federation_audit.json",
283
  "bytes": 6167,
@@ -285,8 +310,8 @@
285
  },
286
  {
287
  "path": "reports/FEDERATION_AUDIT_20260724.md",
288
- "bytes": 7634,
289
- "sha256": "e7009ca51246d66f9ac823f9c988117897ce7e09137242902a8e124c7e2cbdbc"
290
  },
291
  {
292
  "path": "reports/federation_clean_seed17_error_audit.json",
@@ -303,6 +328,21 @@
303
  "bytes": 18173,
304
  "sha256": "6d2ec1880958e64d70e9625c20c581eaea4eaf7e0bf39097bec9e07abd855e56"
305
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
  {
307
  "path": "reports/formula_adapter_h64_3seed_summary.json",
308
  "bytes": 2733,
@@ -570,8 +610,8 @@
570
  },
571
  {
572
  "path": "scripts/train_math_ink_06_federated_online.py",
573
- "bytes": 17362,
574
- "sha256": "d0fd899a4e4d45ad1c0b2863ab83fd83c8bcc8ca5f106ccc579ec68c717aa072"
575
  },
576
  {
577
  "path": "scripts/train_math_ink_06_formula_adapter.py",
 
1
  {
2
+ "schema": "aiflow-hf-research-snapshot-v31",
3
+ "generated_at": "2026-07-25T00:00:00Z",
4
  "track": "R_noncommercial_plus_rejected_P_proxy",
5
  "product_validation": false,
6
  "public_release": true,
7
  "contains_raw_dataset": false,
8
+ "tests": "373 Python passed + 8 Android passed",
9
  "retracted_paths": [
10
  "models/auxiliary/boundary_auxiliary_head.pt",
11
  "models/auxiliary/seed17/boundary_joint_delta.pt",
 
153
  "bytes": 8414,
154
  "sha256": "5ba2955961ad74b4eeef146f4dcc4fa7bc9438a0e6e3840468bdf611c758607c"
155
  },
156
+ {
157
+ "path": "models/auxiliary/boundary_auxiliary_head.pt",
158
+ "bytes": 4024,
159
+ "sha256": "346daa77c4603debe25a3e14c16f9affd1b83f29a43304ecba6c27fe58fb3a74"
160
+ },
161
+ {
162
+ "path": "models/auxiliary/seed17/boundary_joint_delta.pt",
163
+ "bytes": 1485866,
164
+ "sha256": "e770b5e75f7e3819acbfa30cdc46a8c95b80af1747351bacf4eeca2996f2eb73"
165
+ },
166
+ {
167
+ "path": "models/auxiliary/seed31/boundary_joint_delta.pt",
168
+ "bytes": 1485866,
169
+ "sha256": "28ea671447fe053725cc460ef93eb03e66aed69bb150a3f1516a80952b72e523"
170
+ },
171
+ {
172
+ "path": "models/auxiliary/seed47/boundary_joint_delta.pt",
173
+ "bytes": 1485866,
174
+ "sha256": "220461940fe75a257ffc3f2a0147920bc62ab2464bee87159aeebebd6db4e379"
175
+ },
176
  {
177
  "path": "models/research_formula_adapter/seed17/formula_adapter.pt",
178
  "bytes": 92162,
 
245
  },
246
  {
247
  "path": "README.md",
248
+ "bytes": 28466,
249
+ "sha256": "697191c1a2ad5d45c0ce26b919363f5d5077ab235e97d1a9ac14baa191673858"
250
  },
251
  {
252
  "path": "registry/math_ink_06_source_registry.json",
253
+ "bytes": 24325,
254
+ "sha256": "fa256b6cfb22b472530f9c8166aff9a1d69a6716ede8e0dc417a29c9b1b11ccc"
255
  },
256
  {
257
  "path": "reports/behavior_exact_gate_3seed.json",
 
298
  "bytes": 2949,
299
  "sha256": "5f724d7eef306b54f7b1d110f1d5c738d3d9985cd9aa3bdb1aff3478d2e1e647"
300
  },
301
+ {
302
+ "path": "reports/federation_affine_consistent_rejected_report.json",
303
+ "bytes": 8766,
304
+ "sha256": "1f3082a4b16c9d60da1acb511fc01d484674551f5f38b0e48679abab7072115a"
305
+ },
306
  {
307
  "path": "reports/federation_audit.json",
308
  "bytes": 6167,
 
310
  },
311
  {
312
  "path": "reports/FEDERATION_AUDIT_20260724.md",
313
+ "bytes": 16205,
314
+ "sha256": "01827c09c43123e64f9a8db943787bb18b45034124a14ae8c0d651a787993d8d"
315
  },
316
  {
317
  "path": "reports/federation_clean_seed17_error_audit.json",
 
328
  "bytes": 18173,
329
  "sha256": "6d2ec1880958e64d70e9625c20c581eaea4eaf7e0bf39097bec9e07abd855e56"
330
  },
331
+ {
332
+ "path": "reports/federation_crosssource_shadow_report.json",
333
+ "bytes": 9051,
334
+ "sha256": "a3ba389941f30ae0ac37d692677404b1577a7dc09e1ded2f6c5c59aefadc0916"
335
+ },
336
+ {
337
+ "path": "reports/federation_provenance_baseline_seed17_error_audit.json",
338
+ "bytes": 63090,
339
+ "sha256": "984700f7227455db06696bbf65523ab7762587d2aaec4b3350b846d7edf6a3fe"
340
+ },
341
+ {
342
+ "path": "reports/federation_provenance_baseline_seed17_report.json",
343
+ "bytes": 18917,
344
+ "sha256": "6c2530cfe68cd7ce86fcec0ff0290357369abc2092086e75a4dd72dbe7b634a4"
345
+ },
346
  {
347
  "path": "reports/formula_adapter_h64_3seed_summary.json",
348
  "bytes": 2733,
 
610
  },
611
  {
612
  "path": "scripts/train_math_ink_06_federated_online.py",
613
+ "bytes": 30425,
614
+ "sha256": "f47b67c4d3446923557132bb2b3ab16d1a88288d9c9d1e6bc608d840336a80c3"
615
  },
616
  {
617
  "path": "scripts/train_math_ink_06_formula_adapter.py",
README.md CHANGED
@@ -35,14 +35,30 @@ AIFlow Math Ink 0.6은 수학 필기를 **이미지보다 point/stroke sequence
35
 
36
  UJI Pen v1은 v2에 전부 포함된 mirror라 sampler에서 제거했다. HWRT 공식 test는 제품 경로에서 제외하고, 승인 train writer 275명을 별도의 train/validation/test로 다시 나눴다. UJI v2는 공식 test를 보존하면서 train writer validation을 격리했다.
37
 
38
- 현재 registry는 조사 `38/200`, 승인 배포 독립 그룹 `7/30`이 기존 federation checkpoint에는 실제 `training_source_ids` 다. 따라서 공개 모델은 계속 연구용이며 `product_validation=false`다. 교정 전 federation 정확도는 제품 근거로 사용할 수 없다.
39
 
40
  교정 후 seed-17은 checkpoint에 실제 source ID·독립 그룹·registry SHA-256을 기록한다. UJI 전체 train을 포함한 15,829개 source-balanced 학습에서 test online top-1은 Pendigits/UJI v2/HWRT가 `93.2% / 71.8% / 84.0%`, raster top-1은 `42.8% / 41.0% / 74.4%`다. GTX 1650에서는 batch 32가 안정적이고 batch 64는 virtual top-4 peak OOM이었다.
41
 
42
  이 결과는 출처 cap을 풀어도 UJI writer-generalization과 exact case family가 남는다는 근거다. Raster encoder·decoder만 여는 shadow run은 Pendigits를 개선했지만 HWRT holdout을 손상해 자동 guard에서 거부됐고 배포 모델에 포함하지 않는다. 3-seed distillation은 현재 보류 상태다.
43
 
 
 
 
 
44
  동일 writer의 고립 glyph를 baseline anchor로 쓰는 size-resolver proxy도 UJI에서 `51.09% → 45.63%`, HWRT에서 `53.57% → 39.29%`로 악화됐다. 이는 writer 묶음이 실제 수식 행 문맥이 아니라는 반증이다. 따라서 relative-size resolver는 현재 isolated symbol output에는 적용하지 않고, P Formula의 실제 행/Tray context가 확보된 경우에만 다시 검증한다.
45
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  - [사람이 읽는 감사 보고서](reports/FEDERATION_AUDIT_20260724.md)
47
  - [기계 판독 federation audit](reports/federation_audit.json)
48
  - [교정 seed-17 full-source 결과](reports/federation_clean_seed17_fullsource_report.json)
 
35
 
36
  UJI Pen v1은 v2에 전부 포함된 mirror라 sampler에서 제거했다. HWRT 공식 test는 제품 경로에서 제외하고, 승인 train writer 275명을 별도의 train/validation/test로 다시 나눴다. UJI v2는 공식 test를 보존하면서 train writer validation을 격리했다.
37
 
38
+ 현재 registry는 조사 `40/200`, 승인 배포 독립 그룹 `7/30`이다. 교정 후 seed-17 federation checkpoint에는 실제 `training_source_ids` 독립 source group, registry SHA-256이 기록된다. 다만 30개 독립 승인 그룹·3-seed·P writer/device-disjoint release gate가 아직 없으므로 공개 모델은 계속 연구용이며 `product_validation=false`다. 교정 전 federation 정확도는 제품 근거로 사용할 수 없다.
39
 
40
  교정 후 seed-17은 checkpoint에 실제 source ID·독립 그룹·registry SHA-256을 기록한다. UJI 전체 train을 포함한 15,829개 source-balanced 학습에서 test online top-1은 Pendigits/UJI v2/HWRT가 `93.2% / 71.8% / 84.0%`, raster top-1은 `42.8% / 41.0% / 74.4%`다. GTX 1650에서는 batch 32가 안정적이고 batch 64는 virtual top-4 peak OOM이었다.
41
 
42
  이 결과는 출처 cap을 풀어도 UJI writer-generalization과 exact case family가 남는다는 근거다. Raster encoder·decoder만 여는 shadow run은 Pendigits를 개선했지만 HWRT holdout을 손상해 자동 guard에서 거부됐고 배포 모델에 포함하지 않는다. 3-seed distillation은 현재 보류 상태다.
43
 
44
+ Online affine(회전 ±10°·scale ±8%) full-source 1-epoch ablation도 validation macro online top-1 `88.57% → 88.07%`로 하락했고, UJI는 `80.00%`로 그대로인 반면 HWRT online/raster top-1은 `90.04/78.16% → 88.89/76.63%`가 됐다. 선택 결과는 기준선 epoch 0/alpha 0.0이므로 이 증강은 채택하지 않는다.
45
+
46
+ 긴 GPU 실험에는 epoch-state를 남긴다. state에는 student/best/anchor model, Adam, source-balanced sampler generator, Python/NumPy/PyTorch/CUDA RNG이 포함되며 base SHA-256·seed·source·split contract가 모두 일치할 때만 resume한다.
47
+
48
  동일 writer의 고립 glyph를 baseline anchor로 쓰는 size-resolver proxy도 UJI에서 `51.09% → 45.63%`, HWRT에서 `53.57% → 39.29%`로 악화됐다. 이는 writer 묶음이 실제 수식 행 문맥이 아니라는 반증이다. 따라서 relative-size resolver는 현재 isolated symbol output에는 적용하지 않고, P Formula의 실제 행/Tray context가 확보된 경우에만 다시 검증한다.
49
 
50
+ ### 2026-07-25: 기각한 generalization loop와 재현성 보강
51
+
52
+ 기하 일관 affine+raster-loss 후보는 좌표 변환 뒤 `shape/curvature/bbox/aspect/speed`도 다시 계산하도록 수정해 재검증했지만, source macro online이 `88.57% → 88.07%`, HWRT online/raster가 `90.04/78.16% → 88.89/76.63%`로 하락해 채택하지 않았다.
53
+
54
+ Cross-source same-label pair batch와 supervised contrastive loss(weight 0.05)도 연구용으로 검증했다. validation macro는 `88.57% → 89.23%`, UJI validation은 `80% → 82%`였으나 held-out UJI/HWRT online은 `−0.2/−0.4%p`, Pendigits raster는 `−3.2%p`였다. validation-only 상승은 배포 근거가 아니므로 이 checkpoint 역시 shadow로 격리했다.
55
+
56
+ 이 반복에서 과거 stage-3 checkpoint가 현재 loader의 training selection으로 정확히 재현되지 않는 provenance 공백도 확인했다. 이후 trainer는 source별 선택 수와 `(source, sample_id, origin_id)` SHA-256을 checkpoint·report·epoch-resume contract에 넣어, 같은 표본 수이지만 다른 원본을 섞는 재개를 fail-closed로 막는다. `product_validation`은 계속 `false`다.
57
+
58
+ ### Provenance baseline v1
59
+
60
+ 새 seed-17 기준선은 정확히 기록된 15,829 training record(Pendigits 4,457 / UJI v2 5,372 / HWRT 6,000)와 sample-origin SHA-256 `fc103edba331d3682875171b04942a2028232a401a0ca72cd0b1c52da5608c91`를 사용한다. Held-out online top-1/top-5는 Pendigits `95.0/99.4%`, UJI `73.2/94.6%`, HWRT `84.2/99.0%`다. 전체 7,031개 online은 `86.06/97.50%`, visual-family `90.91%`, writer p10 `60.0%`다. 92/99 online, 90% raster, 30 independent P-source, 3-seed gate에는 모두 미달하므로 연구 기준선일 뿐 배포 모델이 아니다.
61
+
62
  - [사람이 읽는 감사 보고서](reports/FEDERATION_AUDIT_20260724.md)
63
  - [기계 판독 federation audit](reports/federation_audit.json)
64
  - [교정 seed-17 full-source 결과](reports/federation_clean_seed17_fullsource_report.json)
registry/math_ink_06_source_registry.json CHANGED
@@ -484,6 +484,32 @@
484
  "local_materialized": true,
485
  "notes": "2026-07-24 공식 mathwriting/README 재검증: 데이터는 CC BY-NC-SA 4.0이다. 상위 repository의 일반 dataset 문구보다 하위 dataset 고유 조건을 우선하며 배포 checkpoint 학습에서 차단한다."
486
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
487
  {
488
  "source_id": "crohme",
489
  "stage": "rights_review",
 
484
  "local_materialized": true,
485
  "notes": "2026-07-24 공식 mathwriting/README 재검증: 데이터는 CC BY-NC-SA 4.0이다. 상위 repository의 일반 dataset 문구보다 하위 dataset 고유 조건을 우선하며 배포 checkpoint 학습에서 차단한다."
486
  },
487
+ {
488
+ "source_id": "mendeley-ink-and-identity-v3",
489
+ "stage": "rights_review",
490
+ "official_url": "https://data.mendeley.com/datasets/2nm9cp89df/3",
491
+ "license_id": "CC-BY-4.0",
492
+ "commercial_allowed": true,
493
+ "allowed_tracks": ["P"],
494
+ "independent_source_group": "mendeley-ink-identity-2025",
495
+ "deployment_role": "raster_pseudo_stroke",
496
+ "vocabulary_policy": "geometry_only",
497
+ "local_materialized": false,
498
+ "notes": "공식 Mendeley v3 페이지의 CC BY 4.0과 450개 사진 기반 문자 표본을 확인했다. label manifest·writer/촬영 group·content hash가 아직 없으므로 raster geometry 후보로만 rights_review에 둔다. raw 사진과 원본 writer ID는 배포 checkpoint에 넣지 않는다."
499
+ },
500
+ {
501
+ "source_id": "mendeley-isgl-online-offline-v1",
502
+ "stage": "rights_review",
503
+ "official_url": "https://data.mendeley.com/datasets/n7kmd7t7yx/1",
504
+ "license_id": "CC-BY-4.0",
505
+ "commercial_allowed": true,
506
+ "allowed_tracks": ["P"],
507
+ "independent_source_group": "isgl-online-offline-2019",
508
+ "deployment_role": "geometry_pretrain",
509
+ "vocabulary_policy": "geometry_only",
510
+ "local_materialized": false,
511
+ "notes": "공식 Mendeley v1 페이지에서 64 writer의 English online/offline 문자·단어와 tablet x/y, time, pen-up/down 기록 및 CC BY 4.0을 확인했다. 파일 구조·개별 label mapping·writer group·content hash를 materialize 검증하기 전에는 geometry pretrain 후보로만 취급한다."
512
+ },
513
  {
514
  "source_id": "crohme",
515
  "stage": "rights_review",
reports/FEDERATION_AUDIT_20260724.md CHANGED
@@ -101,3 +101,51 @@ UJI의 낮은 일반화가 2,000개 source cap 때문인지 확인하기 위해
101
  다음 구현 우선순위는 (1) UJI의 case/O-0/cross family를 formula-relative size·neighbor context로 푸는 exact resolver, (2) source-aware virtual decoder 또는 더 다양한 paired raster↔stroke 데이터다. 이 두 작업 전에는 seed 31·47을 반복하지 않는다. 전체 Python 회귀는 367개를 통과했다.
102
 
103
  상대크기 resolver를 현 UJI/HWRT test의 동일-writer isolated-glyph proxy에 적용한 결과는 UJI 51.09%→45.63%(-5.47%p), HWRT 53.57%→39.29%(-14.29%p)였다. 이 proxy는 실수식의 같은 행 baseline·상대크기가 아니라 writer의 서로 무관한 glyph를 anchor로 사용하므로 product evidence가 아니다. 다만 해로운 자동 뒤집힘을 실제로 확인했으므로 resolver는 현재 고립기호 0.6 반환에 연결하지 않고, 향후 P Formula row의 validated context가 있을 때만 activation한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  다음 구현 우선순위는 (1) UJI의 case/O-0/cross family를 formula-relative size·neighbor context로 푸는 exact resolver, (2) source-aware virtual decoder 또는 더 다양한 paired raster↔stroke 데이터다. 이 두 작업 전에는 seed 31·47을 반복하지 않는다. 전체 Python 회귀는 367개를 통과했다.
102
 
103
  상대크기 resolver를 현 UJI/HWRT test의 동일-writer isolated-glyph proxy에 적용한 결과는 UJI 51.09%→45.63%(-5.47%p), HWRT 53.57%→39.29%(-14.29%p)였다. 이 proxy는 실수식의 같은 행 baseline·상대크기가 아니라 writer의 서로 무관한 glyph를 anchor로 사용하므로 product evidence가 아니다. 다만 해로운 자동 뒤집힘을 실제로 확인했으므로 resolver는 현재 고립기호 0.6 반환에 연결하지 않고, 향후 P Formula row의 validated context가 있을 때만 activation한다.
104
+
105
+ ## Online affine 불변성 pilot
106
+
107
+ UJI의 writer/device 차이가 단순 기울기·크기 분포 차이인지 분리하기 위해, source 특화 규칙 없이 online 19-feature 입력의 좌표·방향 채널에만 회전 ±10°, 등방 scale ±8%를 적용하는 seed-17 대조 학습을 시작했다. 시간·pen-up·pressure·missing metadata 채널은 바꾸지 않았고, teacher와 raster branch는 원본 입력을 유지했다.
108
+
109
+ 1 epoch validation pilot은 macro online top-1 **88.47%**였다. 같은 초기 checkpoint의 무증강 epoch-1은 **88.01%**, epoch-2는 **88.57%**였다. UJI online top-1은 각각 **79.67%**, **78.67%**, **80.00%**였다. 즉 초기 +1.00%p 신호는 있으나 무증강 추가 epoch의 범위 안이며, UJI 단독 개선도 +1.00%p에 그쳤다.
110
+
111
+ 동일 설정의 일관된 full-source run(`stage4_affine_consistent_epoch1`)을 최종 확인한 결과, 검증 macro online top-1은 **88.07%**로 기준선 **88.57%**보다 낮았다. UJI는 80.00%로 같았지만 HWRT online top-1 90.04%→88.89%, raster top-1 78.16%→76.63%가 되어 모든 full update와 일부 interpolation이 HWRT guard에서 탈락했다. 선택 checkpoint는 **epoch 0 / alpha 0.0**, test delta는 모든 source에서 0이었다. 따라서 affine 증강은 성능 후보가 아니라 **기각된 ablation**이다.
112
+
113
+ Windows launcher의 `Path/PATH` 환경 중복으로 처음 실행이 중단되었고, 이후 중복 GPU child가 생긴 것을 즉시 정리했다. 따라서 이 pilot은 최종 test checkpoint를 만들지 않았으며 **배포 후보에 포함하지 않는다**. 다음 반복은 epoch별 checkpoint를 남기는 단일 launcher에서, affine 강도 grid와 full writer/device-disjoint test를 함께 수행해야 한다.
114
+
115
+ 이 요구를 위해 federated online trainer에 epoch-state 저장/재개 계약을 추가했다. epoch-state는 student·선택 best·anchor model state, Adam state, source-balanced sampler generator, Python/NumPy/PyTorch/CUDA RNG, 선택 history를 함께 저장한다. base checkpoint SHA-256, seed, source ID, train 수, split subset 상한이 완전히 같을 때만 `--resume-state`를 허용한다. 따라서 중단된 GPU 실행은 같은 data/난수 계약으로 다음 epoch부터 복구할 수 있으며, 다른 모델이나 다른 split을 이어붙이는 오류는 fail-closed로 거부한다.
116
+
117
+ ### 기하 계약 교정 후 affine+raster-loss 재검증
118
+
119
+ 2026-07-25에 위 affine helper가 `canvas_x/y`·direction만 변환하고 `shape`·curvature·bbox·aspect·speed를 원본 값으로 남기는 계약 오류를 발견했다. 변환 좌표와 파생 feature가 한 sample 안에서 모순되므로, 해당 중단 run은 평가 근거가 아니다. helper는 이제 변환한 canvas coordinate에서 모든 기하 파생 채널을 재생성하며, stroke start/progress·time delta·missing/source modality만 불변으로 보존한다. 관련 단위 9건과 전체 Python 회귀 **367 passed**를 통과했다.
120
+
121
+ 교정 helper로 stage-3 full-source checkpoint에 rotation ±10°, scale ±8%, raster exact/family supervised loss 0.25/0.10을 넣어 15,829개 표본에서 CUDA 1 epoch를 재실행했다. validation macro online top-1은 **88.57%→88.07%**, HWRT online/raster top-1은 **90.04/78.16%→88.89/76.63%**, UJI online top-1은 **80.00%→80.00%**였다. alpha 0.25 interpolation만 HWRT tolerance를 지켰지만 macro 88.33%라 기준선을 넘지 못했다. trainer는 `selected_epoch=0`, `alpha=0.0`으로 원 checkpoint를 보존했고, `stage4_affine_consistent_epoch1_20260725`는 배포·shadow 후보 어느 쪽에도 채택하지 않는다. 다음 loop는 단순 affine/loss 증대가 아닌 독립 online P-source와 실제 formula-row context를 우선한다.
122
+
123
+ ## Cross-source same-label alignment rejection and reproducibility correction
124
+
125
+ source cap 6,000 probe의 source-label balanced sampler를 측정하면 batch 안에서 같은 exact label·다른 source positive를 갖는 anchor가 1,587/17,372, 즉 **9.14%**에 불과했다. UJI↔HWRT는 66 labels, 세 source 공통은 digit 10 labels만 겹친다. 이에 batch 절반을 동일 label의 서로 다른 source pair로 고정하고, shared trajectory embedding에 supervised contrastive loss(weight 0.05, temperature 0.20)를 추가하는 1-epoch seed-17 shadow를 만들었다. 이 sampler/loss와 epoch resume 경로의 회귀는 15건을 통과했다.
126
+
127
+ 첫 실행은 global cap으로 13,371개가 되어 비교 근거에서 제외했다. source cap CSV를 추가해 재실행했지만 Pendigits에 validation split이 없어 현재 trainer가 origin partition을 먼저 적용한다는 점을 확인했다. 실제 구성은 14,286개였고, 과거 stage-3 report의 15,829개 선택 set은 현 코드와 동일하게 재현할 수 없었다. 이는 accuracy 문제가 아니라 **checkpoint training-sample provenance 부족**이다. 이후 trainer는 source별 실제 count와 `(source, sample_id, origin_id)` 전체 SHA-256을 report/checkpoint/resume contract에 기록하며, 같은 표본 수이지만 다른 origin을 사용하는 재개를 fail-closed로 막는다.
128
+
129
+ 14,286개 cross-source run은 validation macro online top-1을 88.57→89.23%, UJI validation을 80.00→82.00%로 높였지만, held-out UJI/HWRT online top-1은 각각 −0.2/−0.4%p, Pendigits raster top-1은 −3.2%p였다. 따라서 validation 상승을 채택 근거로 사용하지 않고 checkpoint는 shadow로 격리한다. stage-3 과거 selection set의 재현 fingerprint가 없으므로 이 실험도 baseline 대체 근거가 아니다. 앞으로의 정식 baseline은 현재 loader가 기록한 source count와 sample-origin fingerprint에서 새로 학습한 뒤에만 ablation 비교를 허용한다.
130
+
131
+ ## Provenance baseline v1
132
+
133
+ 현재 loader로 stage-2 checkpoint부터 seed-17 CUDA 3 epoch를 다시 학습해 첫 재현 가능한 federation baseline을 만들었다. 선택 training set은 15,829개이며 source count는 Pendigits 4,457, UJI v2 5,372, HWRT 6,000이고, `(source, sample_id, origin_id)` SHA-256은 `fc103edba331d3682875171b04942a2028232a401a0ca72cd0b1c52da5608c91`이다. epoch 3/alpha 1.0이 validation guard를 통과해 선택됐다.
134
+
135
+ | held-out source | online top-1 / top-5 | raster top-1 / top-5 |
136
+ |---|---:|---:|
137
+ | Pendigits | 95.0 / 99.4% | 31.6 / 60.6% |
138
+ | UJI Pen v2 | 73.2 / 94.6% | 39.4 / 69.8% |
139
+ | HWRT writer-disjoint | 84.2 / 99.0% | 74.4 / 94.6% |
140
+
141
+ 전수 7,031개 error audit은 online top-1/top-5 **86.06/97.50%**, visual-family top-1 90.91%, writer p10 60.0%다. Exact 오류의 34.80%는 같은 visual family 내부이며 `1→2` 38건, `7→1` 32건, `c→C` 32건, `s→S` 30건, `x→X` 27건, `o→O` 17건이 상위다. 즉 기준선·provenance는 교정됐지만 UJI unseen writer의 case/O-0와 virtual-stroke raster 분포 병목은 남아 있다. 이 checkpoint는 release 92/99/90, 30 source, 3-seed 조건을 하나도 충족하지 못하므로 `product_validation=false`다.
142
+
143
+ ## 외부 data federation 발견 갱신
144
+
145
+ 공식 Mendeley Data v3의 `Ink and Identity`를 새 출처로 조사했다. 이 출처는 CC BY 4.0, 서로 다른 수집 방식의 사진 기반 문자 450개라는 점에서 raster geometry/pseudo-stroke 후보가 될 수 있다. 다만 현재는 label manifest, 작성자 또는 촬영 group, 원본 content hash와 기존 raster 중복 검사가 없으므로 `rights_review`에만 추가했다. 배포 checkpoint와 verifier 학습에는 넣지 않았으며, registry 조사 수는 **39/200**으로만 변했다.
146
+
147
+ 온라인 분야에서는 UCI Character Trajectories(CC BY 4.0, 한 writer)와 BRUSH(170 writer이나 non-commercial)를 다시 대조했다. 전자는 이미 geometry-only rights review로 유지하고, 후자는 상용 P-track에서 제외한다. 따라서 이번 조사로 P supervised source 수나 product gate는 증가하지 않았다.
148
+
149
+ epoch-state의 parameter·optimizer·sampler 복원과 contract mismatch 거부를 포함해 전체 Python 회귀는 **369개**를 통과했다.
150
+
151
+ 후속 조사에서는 ISGL Online/Offline Character Recognition Dataset을 확인했다. CC BY 4.0이며 64 writer의 tablet `x/y`, timestamp, pen-up/down online 기록을 포함하므로 image-only 후보보다 0.6 canonical tap 및 virtual-stroke pretrain에 더 적합하다. 다만 파일 구조, label mapping, writer group, origin hash 확인 전에는 `geometry_pretrain` rights review로만 등록했다. registry 조사 수는 **40/200**이고, P supervised source·승인 독립 그룹·product gate에는 변화가 없다.
reports/federation_affine_consistent_rejected_report.json ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "math_ink_06_candidate.pt",
3
+ "bytes": 8821850,
4
+ "seed": 17,
5
+ "device": "cuda",
6
+ "training_source_ids": [
7
+ "hwrt",
8
+ "uci-pendigits",
9
+ "uci-uji-pen-v2"
10
+ ],
11
+ "training_independent_source_groups": [
12
+ "hwrt-2015",
13
+ "uci-pendigits-81",
14
+ "uji-pen-family"
15
+ ],
16
+ "source_registry_sha256": "7cb528cfb320067d30ec9c53195a0e2e4586d733f569a50db4b563a8666f1c79",
17
+ "train_samples": 15829,
18
+ "source_count": 3,
19
+ "baseline_validation": {
20
+ "uci-pendigits": {
21
+ "samples": 300,
22
+ "online_top1": 0.9566666666666667,
23
+ "online_top5": 1.0,
24
+ "raster_top1": 0.45666666666666667,
25
+ "raster_top5": 0.7766666666666666
26
+ },
27
+ "uci-uji-pen-v2": {
28
+ "samples": 300,
29
+ "online_top1": 0.8,
30
+ "online_top5": 0.9733333333333334,
31
+ "raster_top1": 0.48333333333333334,
32
+ "raster_top5": 0.76
33
+ },
34
+ "hwrt": {
35
+ "samples": 261,
36
+ "online_top1": 0.9003831417624522,
37
+ "online_top5": 1.0,
38
+ "raster_top1": 0.7816091954022989,
39
+ "raster_top5": 0.9770114942528736
40
+ }
41
+ },
42
+ "selected_validation": {
43
+ "uci-pendigits": {
44
+ "samples": 300,
45
+ "online_top1": 0.9566666666666667,
46
+ "online_top5": 1.0,
47
+ "raster_top1": 0.45666666666666667,
48
+ "raster_top5": 0.7766666666666666
49
+ },
50
+ "uci-uji-pen-v2": {
51
+ "samples": 300,
52
+ "online_top1": 0.8,
53
+ "online_top5": 0.9733333333333334,
54
+ "raster_top1": 0.48333333333333334,
55
+ "raster_top5": 0.76
56
+ },
57
+ "hwrt": {
58
+ "samples": 261,
59
+ "online_top1": 0.9003831417624522,
60
+ "online_top5": 1.0,
61
+ "raster_top1": 0.7816091954022989,
62
+ "raster_top5": 0.9770114942528736
63
+ }
64
+ },
65
+ "selected_epoch": 0,
66
+ "selected_interpolation_alpha": 0.0,
67
+ "baseline_test": {
68
+ "uci-pendigits": {
69
+ "samples": 500,
70
+ "online_top1": 0.932,
71
+ "online_top5": 0.994,
72
+ "raster_top1": 0.428,
73
+ "raster_top5": 0.726
74
+ },
75
+ "uci-uji-pen-v2": {
76
+ "samples": 500,
77
+ "online_top1": 0.718,
78
+ "online_top5": 0.938,
79
+ "raster_top1": 0.41,
80
+ "raster_top5": 0.724
81
+ },
82
+ "hwrt": {
83
+ "samples": 500,
84
+ "online_top1": 0.84,
85
+ "online_top5": 0.99,
86
+ "raster_top1": 0.744,
87
+ "raster_top5": 0.946
88
+ }
89
+ },
90
+ "test": {
91
+ "uci-pendigits": {
92
+ "samples": 500,
93
+ "online_top1": 0.932,
94
+ "online_top5": 0.994,
95
+ "raster_top1": 0.428,
96
+ "raster_top5": 0.726
97
+ },
98
+ "uci-uji-pen-v2": {
99
+ "samples": 500,
100
+ "online_top1": 0.718,
101
+ "online_top5": 0.938,
102
+ "raster_top1": 0.41,
103
+ "raster_top5": 0.724
104
+ },
105
+ "hwrt": {
106
+ "samples": 500,
107
+ "online_top1": 0.84,
108
+ "online_top5": 0.99,
109
+ "raster_top1": 0.744,
110
+ "raster_top5": 0.946
111
+ }
112
+ },
113
+ "test_delta": {
114
+ "uci-pendigits": {
115
+ "online_top1": 0.0,
116
+ "online_top5": 0.0,
117
+ "raster_top1": 0.0,
118
+ "raster_top5": 0.0
119
+ },
120
+ "uci-uji-pen-v2": {
121
+ "online_top1": 0.0,
122
+ "online_top5": 0.0,
123
+ "raster_top1": 0.0,
124
+ "raster_top5": 0.0
125
+ },
126
+ "hwrt": {
127
+ "online_top1": 0.0,
128
+ "online_top5": 0.0,
129
+ "raster_top1": 0.0,
130
+ "raster_top5": 0.0
131
+ }
132
+ },
133
+ "history": [
134
+ {
135
+ "epoch": 0,
136
+ "macro_online_top1": 0.885683269476373,
137
+ "validation": {
138
+ "uci-pendigits": {
139
+ "samples": 300,
140
+ "online_top1": 0.9566666666666667,
141
+ "online_top5": 1.0,
142
+ "raster_top1": 0.45666666666666667,
143
+ "raster_top5": 0.7766666666666666
144
+ },
145
+ "uci-uji-pen-v2": {
146
+ "samples": 300,
147
+ "online_top1": 0.8,
148
+ "online_top5": 0.9733333333333334,
149
+ "raster_top1": 0.48333333333333334,
150
+ "raster_top5": 0.76
151
+ },
152
+ "hwrt": {
153
+ "samples": 261,
154
+ "online_top1": 0.9003831417624522,
155
+ "online_top5": 1.0,
156
+ "raster_top1": 0.7816091954022989,
157
+ "raster_top5": 0.9770114942528736
158
+ }
159
+ }
160
+ },
161
+ {
162
+ "epoch": 1,
163
+ "loss": 1.8227067461844622,
164
+ "macro_online_top1": 0.8807407407407407,
165
+ "hwrt_gate": false,
166
+ "validation": {
167
+ "uci-pendigits": {
168
+ "samples": 300,
169
+ "online_top1": 0.9533333333333334,
170
+ "online_top5": 1.0,
171
+ "raster_top1": 0.5033333333333333,
172
+ "raster_top5": 0.8233333333333334
173
+ },
174
+ "uci-uji-pen-v2": {
175
+ "samples": 300,
176
+ "online_top1": 0.8,
177
+ "online_top5": 0.9733333333333334,
178
+ "raster_top1": 0.48,
179
+ "raster_top5": 0.79
180
+ },
181
+ "hwrt": {
182
+ "samples": 261,
183
+ "online_top1": 0.8888888888888888,
184
+ "online_top5": 1.0,
185
+ "raster_top1": 0.7662835249042146,
186
+ "raster_top5": 0.9731800766283525
187
+ }
188
+ },
189
+ "interpolation": [
190
+ {
191
+ "alpha": 0.25,
192
+ "macro_online_top1": 0.8832950191570882,
193
+ "hwrt_gate": true,
194
+ "validation": {
195
+ "uci-pendigits": {
196
+ "samples": 300,
197
+ "online_top1": 0.9566666666666667,
198
+ "online_top5": 1.0,
199
+ "raster_top1": 0.47,
200
+ "raster_top5": 0.7933333333333333
201
+ },
202
+ "uci-uji-pen-v2": {
203
+ "samples": 300,
204
+ "online_top1": 0.7966666666666666,
205
+ "online_top5": 0.9733333333333334,
206
+ "raster_top1": 0.48,
207
+ "raster_top5": 0.7666666666666667
208
+ },
209
+ "hwrt": {
210
+ "samples": 261,
211
+ "online_top1": 0.896551724137931,
212
+ "online_top5": 1.0,
213
+ "raster_top1": 0.7777777777777778,
214
+ "raster_top5": 0.9770114942528736
215
+ }
216
+ }
217
+ },
218
+ {
219
+ "alpha": 0.5,
220
+ "macro_online_top1": 0.8820178799489145,
221
+ "hwrt_gate": false,
222
+ "validation": {
223
+ "uci-pendigits": {
224
+ "samples": 300,
225
+ "online_top1": 0.9533333333333334,
226
+ "online_top5": 1.0,
227
+ "raster_top1": 0.47333333333333333,
228
+ "raster_top5": 0.8033333333333333
229
+ },
230
+ "uci-uji-pen-v2": {
231
+ "samples": 300,
232
+ "online_top1": 0.8,
233
+ "online_top5": 0.9733333333333334,
234
+ "raster_top1": 0.48,
235
+ "raster_top5": 0.7733333333333333
236
+ },
237
+ "hwrt": {
238
+ "samples": 261,
239
+ "online_top1": 0.89272030651341,
240
+ "online_top5": 1.0,
241
+ "raster_top1": 0.7624521072796935,
242
+ "raster_top5": 0.9770114942528736
243
+ }
244
+ }
245
+ },
246
+ {
247
+ "alpha": 0.75,
248
+ "macro_online_top1": 0.878684546615581,
249
+ "hwrt_gate": false,
250
+ "validation": {
251
+ "uci-pendigits": {
252
+ "samples": 300,
253
+ "online_top1": 0.95,
254
+ "online_top5": 1.0,
255
+ "raster_top1": 0.48333333333333334,
256
+ "raster_top5": 0.8133333333333334
257
+ },
258
+ "uci-uji-pen-v2": {
259
+ "samples": 300,
260
+ "online_top1": 0.7933333333333333,
261
+ "online_top5": 0.9733333333333334,
262
+ "raster_top1": 0.48333333333333334,
263
+ "raster_top5": 0.78
264
+ },
265
+ "hwrt": {
266
+ "samples": 261,
267
+ "online_top1": 0.89272030651341,
268
+ "online_top5": 1.0,
269
+ "raster_top1": 0.7662835249042146,
270
+ "raster_top5": 0.9731800766283525
271
+ }
272
+ }
273
+ },
274
+ {
275
+ "alpha": 1.0,
276
+ "macro_online_top1": 0.8807407407407407,
277
+ "hwrt_gate": false,
278
+ "validation": {
279
+ "uci-pendigits": {
280
+ "samples": 300,
281
+ "online_top1": 0.9533333333333334,
282
+ "online_top5": 1.0,
283
+ "raster_top1": 0.5033333333333333,
284
+ "raster_top5": 0.8233333333333334
285
+ },
286
+ "uci-uji-pen-v2": {
287
+ "samples": 300,
288
+ "online_top1": 0.8,
289
+ "online_top5": 0.9733333333333334,
290
+ "raster_top1": 0.48,
291
+ "raster_top5": 0.79
292
+ },
293
+ "hwrt": {
294
+ "samples": 261,
295
+ "online_top1": 0.8888888888888888,
296
+ "online_top5": 1.0,
297
+ "raster_top1": 0.7662835249042146,
298
+ "raster_top5": 0.9731800766283525
299
+ }
300
+ }
301
+ }
302
+ ]
303
+ }
304
+ ],
305
+ "hwrt_official_test_used": false,
306
+ "product_validation": false
307
+ }
reports/federation_crosssource_shadow_report.json ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "math_ink_06_candidate.pt",
3
+ "bytes": 8821978,
4
+ "seed": 17,
5
+ "device": "cuda",
6
+ "training_source_ids": [
7
+ "hwrt",
8
+ "uci-pendigits",
9
+ "uci-uji-pen-v2"
10
+ ],
11
+ "training_independent_source_groups": [
12
+ "hwrt-2015",
13
+ "uci-pendigits-81",
14
+ "uji-pen-family"
15
+ ],
16
+ "source_registry_sha256": "fa256b6cfb22b472530f9c8166aff9a1d69a6716ede8e0dc417a29c9b1b11ccc",
17
+ "train_samples": 13371,
18
+ "source_count": 3,
19
+ "baseline_validation": {
20
+ "uci-pendigits": {
21
+ "samples": 300,
22
+ "online_top1": 0.9566666666666667,
23
+ "online_top5": 1.0,
24
+ "raster_top1": 0.45666666666666667,
25
+ "raster_top5": 0.7766666666666666
26
+ },
27
+ "uci-uji-pen-v2": {
28
+ "samples": 300,
29
+ "online_top1": 0.8,
30
+ "online_top5": 0.9733333333333334,
31
+ "raster_top1": 0.48333333333333334,
32
+ "raster_top5": 0.76
33
+ },
34
+ "hwrt": {
35
+ "samples": 261,
36
+ "online_top1": 0.9003831417624522,
37
+ "online_top5": 1.0,
38
+ "raster_top1": 0.7816091954022989,
39
+ "raster_top5": 0.9770114942528736
40
+ }
41
+ },
42
+ "selected_validation": {
43
+ "uci-pendigits": {
44
+ "samples": 300,
45
+ "online_top1": 0.9566666666666667,
46
+ "online_top5": 1.0,
47
+ "raster_top1": 0.43333333333333335,
48
+ "raster_top5": 0.7433333333333333
49
+ },
50
+ "uci-uji-pen-v2": {
51
+ "samples": 300,
52
+ "online_top1": 0.81,
53
+ "online_top5": 0.9733333333333334,
54
+ "raster_top1": 0.49,
55
+ "raster_top5": 0.76
56
+ },
57
+ "hwrt": {
58
+ "samples": 261,
59
+ "online_top1": 0.9042145593869731,
60
+ "online_top5": 1.0,
61
+ "raster_top1": 0.7854406130268199,
62
+ "raster_top5": 0.9731800766283525
63
+ }
64
+ },
65
+ "selected_epoch": 1,
66
+ "selected_interpolation_alpha": 0.5,
67
+ "baseline_test": {
68
+ "uci-pendigits": {
69
+ "samples": 500,
70
+ "online_top1": 0.932,
71
+ "online_top5": 0.994,
72
+ "raster_top1": 0.428,
73
+ "raster_top5": 0.726
74
+ },
75
+ "uci-uji-pen-v2": {
76
+ "samples": 500,
77
+ "online_top1": 0.718,
78
+ "online_top5": 0.938,
79
+ "raster_top1": 0.41,
80
+ "raster_top5": 0.724
81
+ },
82
+ "hwrt": {
83
+ "samples": 500,
84
+ "online_top1": 0.84,
85
+ "online_top5": 0.99,
86
+ "raster_top1": 0.744,
87
+ "raster_top5": 0.946
88
+ }
89
+ },
90
+ "test": {
91
+ "uci-pendigits": {
92
+ "samples": 500,
93
+ "online_top1": 0.932,
94
+ "online_top5": 0.994,
95
+ "raster_top1": 0.408,
96
+ "raster_top5": 0.72
97
+ },
98
+ "uci-uji-pen-v2": {
99
+ "samples": 500,
100
+ "online_top1": 0.716,
101
+ "online_top5": 0.94,
102
+ "raster_top1": 0.41,
103
+ "raster_top5": 0.726
104
+ },
105
+ "hwrt": {
106
+ "samples": 500,
107
+ "online_top1": 0.84,
108
+ "online_top5": 0.99,
109
+ "raster_top1": 0.738,
110
+ "raster_top5": 0.946
111
+ }
112
+ },
113
+ "test_delta": {
114
+ "uci-pendigits": {
115
+ "online_top1": 0.0,
116
+ "online_top5": 0.0,
117
+ "raster_top1": -0.020000000000000018,
118
+ "raster_top5": -0.006000000000000005
119
+ },
120
+ "uci-uji-pen-v2": {
121
+ "online_top1": -0.0020000000000000018,
122
+ "online_top5": 0.0020000000000000018,
123
+ "raster_top1": 0.0,
124
+ "raster_top5": 0.0020000000000000018
125
+ },
126
+ "hwrt": {
127
+ "online_top1": 0.0,
128
+ "online_top5": 0.0,
129
+ "raster_top1": -0.006000000000000005,
130
+ "raster_top5": 0.0
131
+ }
132
+ },
133
+ "history": [
134
+ {
135
+ "epoch": 0,
136
+ "macro_online_top1": 0.885683269476373,
137
+ "validation": {
138
+ "uci-pendigits": {
139
+ "samples": 300,
140
+ "online_top1": 0.9566666666666667,
141
+ "online_top5": 1.0,
142
+ "raster_top1": 0.45666666666666667,
143
+ "raster_top5": 0.7766666666666666
144
+ },
145
+ "uci-uji-pen-v2": {
146
+ "samples": 300,
147
+ "online_top1": 0.8,
148
+ "online_top5": 0.9733333333333334,
149
+ "raster_top1": 0.48333333333333334,
150
+ "raster_top5": 0.76
151
+ },
152
+ "hwrt": {
153
+ "samples": 261,
154
+ "online_top1": 0.9003831417624522,
155
+ "online_top5": 1.0,
156
+ "raster_top1": 0.7816091954022989,
157
+ "raster_top5": 0.9770114942528736
158
+ }
159
+ }
160
+ },
161
+ {
162
+ "epoch": 1,
163
+ "loss": 0.9748340293265986,
164
+ "cross_source_contrastive_anchors": 7505,
165
+ "macro_online_top1": 0.8879054916985951,
166
+ "hwrt_gate": true,
167
+ "validation": {
168
+ "uci-pendigits": {
169
+ "samples": 300,
170
+ "online_top1": 0.9566666666666667,
171
+ "online_top5": 1.0,
172
+ "raster_top1": 0.4166666666666667,
173
+ "raster_top5": 0.7133333333333334
174
+ },
175
+ "uci-uji-pen-v2": {
176
+ "samples": 300,
177
+ "online_top1": 0.8066666666666666,
178
+ "online_top5": 0.9733333333333334,
179
+ "raster_top1": 0.49333333333333335,
180
+ "raster_top5": 0.7633333333333333
181
+ },
182
+ "hwrt": {
183
+ "samples": 261,
184
+ "online_top1": 0.9003831417624522,
185
+ "online_top5": 1.0,
186
+ "raster_top1": 0.7854406130268199,
187
+ "raster_top5": 0.9731800766283525
188
+ }
189
+ },
190
+ "interpolation": [
191
+ {
192
+ "alpha": 0.25,
193
+ "macro_online_top1": 0.885683269476373,
194
+ "hwrt_gate": true,
195
+ "validation": {
196
+ "uci-pendigits": {
197
+ "samples": 300,
198
+ "online_top1": 0.9566666666666667,
199
+ "online_top5": 1.0,
200
+ "raster_top1": 0.44666666666666666,
201
+ "raster_top5": 0.7566666666666667
202
+ },
203
+ "uci-uji-pen-v2": {
204
+ "samples": 300,
205
+ "online_top1": 0.8,
206
+ "online_top5": 0.9733333333333334,
207
+ "raster_top1": 0.4866666666666667,
208
+ "raster_top5": 0.76
209
+ },
210
+ "hwrt": {
211
+ "samples": 261,
212
+ "online_top1": 0.9003831417624522,
213
+ "online_top5": 1.0,
214
+ "raster_top1": 0.789272030651341,
215
+ "raster_top5": 0.9770114942528736
216
+ }
217
+ }
218
+ },
219
+ {
220
+ "alpha": 0.5,
221
+ "macro_online_top1": 0.8902937420178799,
222
+ "hwrt_gate": true,
223
+ "validation": {
224
+ "uci-pendigits": {
225
+ "samples": 300,
226
+ "online_top1": 0.9566666666666667,
227
+ "online_top5": 1.0,
228
+ "raster_top1": 0.43333333333333335,
229
+ "raster_top5": 0.7433333333333333
230
+ },
231
+ "uci-uji-pen-v2": {
232
+ "samples": 300,
233
+ "online_top1": 0.81,
234
+ "online_top5": 0.9733333333333334,
235
+ "raster_top1": 0.49,
236
+ "raster_top5": 0.76
237
+ },
238
+ "hwrt": {
239
+ "samples": 261,
240
+ "online_top1": 0.9042145593869731,
241
+ "online_top5": 1.0,
242
+ "raster_top1": 0.7854406130268199,
243
+ "raster_top5": 0.9731800766283525
244
+ }
245
+ }
246
+ },
247
+ {
248
+ "alpha": 0.75,
249
+ "macro_online_top1": 0.8891826309067689,
250
+ "hwrt_gate": true,
251
+ "validation": {
252
+ "uci-pendigits": {
253
+ "samples": 300,
254
+ "online_top1": 0.9566666666666667,
255
+ "online_top5": 1.0,
256
+ "raster_top1": 0.42,
257
+ "raster_top5": 0.7366666666666667
258
+ },
259
+ "uci-uji-pen-v2": {
260
+ "samples": 300,
261
+ "online_top1": 0.8066666666666666,
262
+ "online_top5": 0.9733333333333334,
263
+ "raster_top1": 0.49333333333333335,
264
+ "raster_top5": 0.7633333333333333
265
+ },
266
+ "hwrt": {
267
+ "samples": 261,
268
+ "online_top1": 0.9042145593869731,
269
+ "online_top5": 1.0,
270
+ "raster_top1": 0.789272030651341,
271
+ "raster_top5": 0.9731800766283525
272
+ }
273
+ }
274
+ },
275
+ {
276
+ "alpha": 1.0,
277
+ "macro_online_top1": 0.8879054916985951,
278
+ "hwrt_gate": true,
279
+ "validation": {
280
+ "uci-pendigits": {
281
+ "samples": 300,
282
+ "online_top1": 0.9566666666666667,
283
+ "online_top5": 1.0,
284
+ "raster_top1": 0.4166666666666667,
285
+ "raster_top5": 0.7133333333333334
286
+ },
287
+ "uci-uji-pen-v2": {
288
+ "samples": 300,
289
+ "online_top1": 0.8066666666666666,
290
+ "online_top5": 0.9733333333333334,
291
+ "raster_top1": 0.49333333333333335,
292
+ "raster_top5": 0.7633333333333333
293
+ },
294
+ "hwrt": {
295
+ "samples": 261,
296
+ "online_top1": 0.9003831417624522,
297
+ "online_top5": 1.0,
298
+ "raster_top1": 0.7854406130268199,
299
+ "raster_top5": 0.9731800766283525
300
+ }
301
+ }
302
+ }
303
+ ],
304
+ "resume_state": "federated_online_epoch_001.pt"
305
+ }
306
+ ],
307
+ "hwrt_official_test_used": false,
308
+ "product_validation": false
309
+ }
reports/federation_provenance_baseline_seed17_error_audit.json ADDED
@@ -0,0 +1,2801 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "samples": 7031,
3
+ "top1": 0.8606172800064087,
4
+ "top5": 0.9749680161476135,
5
+ "shape_family_top1": 0.9091167449951172,
6
+ "casefold_top1": 0.8994452953338623,
7
+ "case_only_error_rate": 0.2785714285714286,
8
+ "source_metrics": {
9
+ "hwrt": {
10
+ "samples": 552,
11
+ "top1": 0.85326087474823,
12
+ "top5": 0.9909420013427734
13
+ },
14
+ "uci-pendigits": {
15
+ "samples": 3498,
16
+ "top1": 0.9482561349868774,
17
+ "top5": 0.9942824244499207
18
+ },
19
+ "uci-uji-pen-v2": {
20
+ "samples": 2981,
21
+ "top1": 0.759141206741333,
22
+ "top5": 0.9493458867073059
23
+ }
24
+ },
25
+ "writer_count": 49,
26
+ "writer_accuracy_p10": 0.6,
27
+ "writer_accuracy_minimum": 0.0,
28
+ "errors": 980,
29
+ "same_family_error_rate": 0.3479591836734694,
30
+ "different_family_error_rate": 0.6520408163265307,
31
+ "top_confusions": [
32
+ {
33
+ "truth": "1",
34
+ "prediction": "2",
35
+ "count": 38
36
+ },
37
+ {
38
+ "truth": "7",
39
+ "prediction": "1",
40
+ "count": 32
41
+ },
42
+ {
43
+ "truth": "c",
44
+ "prediction": "C",
45
+ "count": 32
46
+ },
47
+ {
48
+ "truth": "s",
49
+ "prediction": "S",
50
+ "count": 30
51
+ },
52
+ {
53
+ "truth": "x",
54
+ "prediction": "X",
55
+ "count": 27
56
+ },
57
+ {
58
+ "truth": "o",
59
+ "prediction": "O",
60
+ "count": 17
61
+ },
62
+ {
63
+ "truth": "z",
64
+ "prediction": "Z",
65
+ "count": 16
66
+ },
67
+ {
68
+ "truth": "w",
69
+ "prediction": "W",
70
+ "count": 15
71
+ },
72
+ {
73
+ "truth": "P",
74
+ "prediction": "p",
75
+ "count": 14
76
+ },
77
+ {
78
+ "truth": "W",
79
+ "prediction": "w",
80
+ "count": 14
81
+ },
82
+ {
83
+ "truth": "v",
84
+ "prediction": "V",
85
+ "count": 13
86
+ },
87
+ {
88
+ "truth": "Z",
89
+ "prediction": "z",
90
+ "count": 12
91
+ },
92
+ {
93
+ "truth": "O",
94
+ "prediction": "0",
95
+ "count": 12
96
+ },
97
+ {
98
+ "truth": "3",
99
+ "prediction": "7",
100
+ "count": 10
101
+ },
102
+ {
103
+ "truth": "O",
104
+ "prediction": "o",
105
+ "count": 10
106
+ },
107
+ {
108
+ "truth": "0",
109
+ "prediction": "O",
110
+ "count": 10
111
+ },
112
+ {
113
+ "truth": "5",
114
+ "prediction": "9",
115
+ "count": 9
116
+ },
117
+ {
118
+ "truth": "o",
119
+ "prediction": "0",
120
+ "count": 9
121
+ },
122
+ {
123
+ "truth": "2",
124
+ "prediction": "1",
125
+ "count": 8
126
+ },
127
+ {
128
+ "truth": "9",
129
+ "prediction": "3",
130
+ "count": 8
131
+ },
132
+ {
133
+ "truth": "5",
134
+ "prediction": "3",
135
+ "count": 8
136
+ },
137
+ {
138
+ "truth": "V",
139
+ "prediction": "v",
140
+ "count": 7
141
+ },
142
+ {
143
+ "truth": "Y",
144
+ "prediction": "y",
145
+ "count": 7
146
+ },
147
+ {
148
+ "truth": ",",
149
+ "prediction": ")",
150
+ "count": 7
151
+ },
152
+ {
153
+ "truth": "'",
154
+ "prediction": ",",
155
+ "count": 7
156
+ },
157
+ {
158
+ "truth": "k",
159
+ "prediction": "K",
160
+ "count": 7
161
+ },
162
+ {
163
+ "truth": "9",
164
+ "prediction": "q",
165
+ "count": 7
166
+ },
167
+ {
168
+ "truth": "1",
169
+ "prediction": "I",
170
+ "count": 7
171
+ },
172
+ {
173
+ "truth": "7",
174
+ "prediction": "2",
175
+ "count": 6
176
+ },
177
+ {
178
+ "truth": "8",
179
+ "prediction": "9",
180
+ "count": 6
181
+ }
182
+ ],
183
+ "highest_error_labels": [
184
+ {
185
+ "label": "1",
186
+ "test_support": 418,
187
+ "training_support": 908,
188
+ "top1": 0.8516746411483254,
189
+ "top5": 0.992822966507177,
190
+ "errors": 62
191
+ },
192
+ {
193
+ "label": "7",
194
+ "test_support": 411,
195
+ "training_support": 904,
196
+ "top1": 0.8880778588807786,
197
+ "top5": 0.9683698296836983,
198
+ "errors": 46
199
+ },
200
+ {
201
+ "label": "x",
202
+ "test_support": 48,
203
+ "training_support": 120,
204
+ "top1": 0.16666666666666666,
205
+ "top5": 0.875,
206
+ "errors": 40
207
+ },
208
+ {
209
+ "label": "s",
210
+ "test_support": 47,
211
+ "training_support": 115,
212
+ "top1": 0.19148936170212766,
213
+ "top5": 0.9148936170212766,
214
+ "errors": 38
215
+ },
216
+ {
217
+ "label": "9",
218
+ "test_support": 382,
219
+ "training_support": 861,
220
+ "top1": 0.9083769633507853,
221
+ "top5": 0.9895287958115183,
222
+ "errors": 35
223
+ },
224
+ {
225
+ "label": "o",
226
+ "test_support": 47,
227
+ "training_support": 118,
228
+ "top1": 0.2765957446808511,
229
+ "top5": 0.9148936170212766,
230
+ "errors": 34
231
+ },
232
+ {
233
+ "label": "c",
234
+ "test_support": 45,
235
+ "training_support": 123,
236
+ "top1": 0.26666666666666666,
237
+ "top5": 1.0,
238
+ "errors": 33
239
+ },
240
+ {
241
+ "label": "'",
242
+ "test_support": 40,
243
+ "training_support": 72,
244
+ "top1": 0.225,
245
+ "top5": 0.825,
246
+ "errors": 31
247
+ },
248
+ {
249
+ "label": "z",
250
+ "test_support": 47,
251
+ "training_support": 117,
252
+ "top1": 0.44680851063829785,
253
+ "top5": 0.9148936170212766,
254
+ "errors": 26
255
+ },
256
+ {
257
+ "label": "5",
258
+ "test_support": 382,
259
+ "training_support": 852,
260
+ "top1": 0.9319371727748691,
261
+ "top5": 0.9973821989528796,
262
+ "errors": 26
263
+ },
264
+ {
265
+ "label": "O",
266
+ "test_support": 45,
267
+ "training_support": 141,
268
+ "top1": 0.4444444444444444,
269
+ "top5": 0.9555555555555556,
270
+ "errors": 25
271
+ },
272
+ {
273
+ "label": "v",
274
+ "test_support": 45,
275
+ "training_support": 121,
276
+ "top1": 0.4888888888888889,
277
+ "top5": 1.0,
278
+ "errors": 23
279
+ },
280
+ {
281
+ "label": "w",
282
+ "test_support": 45,
283
+ "training_support": 116,
284
+ "top1": 0.5111111111111111,
285
+ "top5": 0.9777777777777777,
286
+ "errors": 22
287
+ },
288
+ {
289
+ "label": ".",
290
+ "test_support": 22,
291
+ "training_support": 103,
292
+ "top1": 0.045454545454545456,
293
+ "top5": 0.36363636363636365,
294
+ "errors": 21
295
+ },
296
+ {
297
+ "label": "P",
298
+ "test_support": 47,
299
+ "training_support": 127,
300
+ "top1": 0.5531914893617021,
301
+ "top5": 0.9574468085106383,
302
+ "errors": 21
303
+ },
304
+ {
305
+ "label": "8",
306
+ "test_support": 392,
307
+ "training_support": 852,
308
+ "top1": 0.9489795918367347,
309
+ "top5": 1.0,
310
+ "errors": 20
311
+ },
312
+ {
313
+ "label": "Z",
314
+ "test_support": 44,
315
+ "training_support": 123,
316
+ "top1": 0.5909090909090909,
317
+ "top5": 0.9090909090909091,
318
+ "errors": 18
319
+ },
320
+ {
321
+ "label": "3",
322
+ "test_support": 381,
323
+ "training_support": 863,
324
+ "top1": 0.9553805774278216,
325
+ "top5": 0.9973753280839895,
326
+ "errors": 17
327
+ },
328
+ {
329
+ "label": "0",
330
+ "test_support": 406,
331
+ "training_support": 927,
332
+ "top1": 0.958128078817734,
333
+ "top5": 0.9975369458128078,
334
+ "errors": 17
335
+ },
336
+ {
337
+ "label": "4",
338
+ "test_support": 410,
339
+ "training_support": 895,
340
+ "top1": 0.9585365853658536,
341
+ "top5": 0.9975609756097561,
342
+ "errors": 17
343
+ },
344
+ {
345
+ "label": ",",
346
+ "test_support": 40,
347
+ "training_support": 72,
348
+ "top1": 0.6,
349
+ "top5": 0.75,
350
+ "errors": 16
351
+ },
352
+ {
353
+ "label": "q",
354
+ "test_support": 45,
355
+ "training_support": 128,
356
+ "top1": 0.6444444444444445,
357
+ "top5": 0.9333333333333333,
358
+ "errors": 16
359
+ },
360
+ {
361
+ "label": "V",
362
+ "test_support": 43,
363
+ "training_support": 119,
364
+ "top1": 0.6511627906976745,
365
+ "top5": 0.9534883720930233,
366
+ "errors": 15
367
+ },
368
+ {
369
+ "label": "p",
370
+ "test_support": 47,
371
+ "training_support": 113,
372
+ "top1": 0.6808510638297872,
373
+ "top5": 0.9574468085106383,
374
+ "errors": 15
375
+ },
376
+ {
377
+ "label": "I",
378
+ "test_support": 49,
379
+ "training_support": 141,
380
+ "top1": 0.6938775510204082,
381
+ "top5": 0.7959183673469388,
382
+ "errors": 15
383
+ },
384
+ {
385
+ "label": "W",
386
+ "test_support": 44,
387
+ "training_support": 122,
388
+ "top1": 0.6818181818181818,
389
+ "top5": 1.0,
390
+ "errors": 14
391
+ },
392
+ {
393
+ "label": "y",
394
+ "test_support": 45,
395
+ "training_support": 118,
396
+ "top1": 0.6888888888888889,
397
+ "top5": 0.9333333333333333,
398
+ "errors": 14
399
+ },
400
+ {
401
+ "label": "Y",
402
+ "test_support": 43,
403
+ "training_support": 117,
404
+ "top1": 0.7209302325581395,
405
+ "top5": 0.8837209302325582,
406
+ "errors": 12
407
+ },
408
+ {
409
+ "label": "U",
410
+ "test_support": 45,
411
+ "training_support": 118,
412
+ "top1": 0.7333333333333333,
413
+ "top5": 1.0,
414
+ "errors": 12
415
+ },
416
+ {
417
+ "label": "X",
418
+ "test_support": 45,
419
+ "training_support": 113,
420
+ "top1": 0.7333333333333333,
421
+ "top5": 0.9333333333333333,
422
+ "errors": 12
423
+ },
424
+ {
425
+ "label": "K",
426
+ "test_support": 50,
427
+ "training_support": 141,
428
+ "top1": 0.76,
429
+ "top5": 0.92,
430
+ "errors": 12
431
+ },
432
+ {
433
+ "label": "k",
434
+ "test_support": 43,
435
+ "training_support": 119,
436
+ "top1": 0.7441860465116279,
437
+ "top5": 0.9767441860465116,
438
+ "errors": 11
439
+ },
440
+ {
441
+ "label": "S",
442
+ "test_support": 45,
443
+ "training_support": 122,
444
+ "top1": 0.7555555555555555,
445
+ "top5": 0.9333333333333333,
446
+ "errors": 11
447
+ },
448
+ {
449
+ "label": "u",
450
+ "test_support": 46,
451
+ "training_support": 115,
452
+ "top1": 0.7608695652173914,
453
+ "top5": 0.9565217391304348,
454
+ "errors": 11
455
+ },
456
+ {
457
+ "label": "\"",
458
+ "test_support": 40,
459
+ "training_support": 72,
460
+ "top1": 0.75,
461
+ "top5": 0.975,
462
+ "errors": 10
463
+ },
464
+ {
465
+ "label": "2",
466
+ "test_support": 414,
467
+ "training_support": 915,
468
+ "top1": 0.9758454106280193,
469
+ "top5": 0.9927536231884058,
470
+ "errors": 10
471
+ },
472
+ {
473
+ "label": "J",
474
+ "test_support": 44,
475
+ "training_support": 145,
476
+ "top1": 0.7954545454545454,
477
+ "top5": 0.9772727272727273,
478
+ "errors": 9
479
+ },
480
+ {
481
+ "label": "M",
482
+ "test_support": 44,
483
+ "training_support": 135,
484
+ "top1": 0.7954545454545454,
485
+ "top5": 0.9772727272727273,
486
+ "errors": 9
487
+ },
488
+ {
489
+ "label": "l",
490
+ "test_support": 45,
491
+ "training_support": 115,
492
+ "top1": 0.8,
493
+ "top5": 0.9777777777777777,
494
+ "errors": 9
495
+ },
496
+ {
497
+ "label": "L",
498
+ "test_support": 51,
499
+ "training_support": 138,
500
+ "top1": 0.8235294117647058,
501
+ "top5": 0.9215686274509803,
502
+ "errors": 9
503
+ }
504
+ ],
505
+ "lowest_supported_labels": [
506
+ {
507
+ "label": "\\mathbb{N}",
508
+ "test_support": 2,
509
+ "training_support": 41,
510
+ "top1": 1.0,
511
+ "top5": 1.0,
512
+ "errors": 0
513
+ },
514
+ {
515
+ "label": "\\mathbb{R}",
516
+ "test_support": 4,
517
+ "training_support": 44,
518
+ "top1": 1.0,
519
+ "top5": 1.0,
520
+ "errors": 0
521
+ },
522
+ {
523
+ "label": "\\mathbb{Q}",
524
+ "test_support": 1,
525
+ "training_support": 44,
526
+ "top1": 0.0,
527
+ "top5": 1.0,
528
+ "errors": 1
529
+ },
530
+ {
531
+ "label": "\\blacktriangleright",
532
+ "test_support": 1,
533
+ "training_support": 52,
534
+ "top1": 1.0,
535
+ "top5": 1.0,
536
+ "errors": 0
537
+ },
538
+ {
539
+ "label": "\\mathbb{Z}",
540
+ "test_support": 2,
541
+ "training_support": 56,
542
+ "top1": 1.0,
543
+ "top5": 1.0,
544
+ "errors": 0
545
+ },
546
+ {
547
+ "label": "+",
548
+ "test_support": 16,
549
+ "training_support": 58,
550
+ "top1": 1.0,
551
+ "top5": 1.0,
552
+ "errors": 0
553
+ },
554
+ {
555
+ "label": "\\mathbb{H}",
556
+ "test_support": 2,
557
+ "training_support": 61,
558
+ "top1": 1.0,
559
+ "top5": 1.0,
560
+ "errors": 0
561
+ },
562
+ {
563
+ "label": "!",
564
+ "test_support": 40,
565
+ "training_support": 72,
566
+ "top1": 0.925,
567
+ "top5": 1.0,
568
+ "errors": 3
569
+ },
570
+ {
571
+ "label": "\"",
572
+ "test_support": 40,
573
+ "training_support": 72,
574
+ "top1": 0.75,
575
+ "top5": 0.975,
576
+ "errors": 10
577
+ },
578
+ {
579
+ "label": "'",
580
+ "test_support": 40,
581
+ "training_support": 72,
582
+ "top1": 0.225,
583
+ "top5": 0.825,
584
+ "errors": 31
585
+ },
586
+ {
587
+ "label": "(",
588
+ "test_support": 40,
589
+ "training_support": 72,
590
+ "top1": 0.875,
591
+ "top5": 1.0,
592
+ "errors": 5
593
+ },
594
+ {
595
+ "label": ")",
596
+ "test_support": 40,
597
+ "training_support": 72,
598
+ "top1": 0.95,
599
+ "top5": 1.0,
600
+ "errors": 2
601
+ },
602
+ {
603
+ "label": ",",
604
+ "test_support": 40,
605
+ "training_support": 72,
606
+ "top1": 0.6,
607
+ "top5": 0.75,
608
+ "errors": 16
609
+ },
610
+ {
611
+ "label": ":",
612
+ "test_support": 40,
613
+ "training_support": 72,
614
+ "top1": 0.875,
615
+ "top5": 1.0,
616
+ "errors": 5
617
+ },
618
+ {
619
+ "label": ";",
620
+ "test_support": 40,
621
+ "training_support": 72,
622
+ "top1": 0.825,
623
+ "top5": 0.975,
624
+ "errors": 7
625
+ },
626
+ {
627
+ "label": "t",
628
+ "test_support": 40,
629
+ "training_support": 72,
630
+ "top1": 0.8,
631
+ "top5": 0.9,
632
+ "errors": 8
633
+ },
634
+ {
635
+ "label": "\\subset",
636
+ "test_support": 4,
637
+ "training_support": 75,
638
+ "top1": 0.5,
639
+ "top5": 1.0,
640
+ "errors": 2
641
+ },
642
+ {
643
+ "label": "\\barwedge",
644
+ "test_support": 3,
645
+ "training_support": 75,
646
+ "top1": 1.0,
647
+ "top5": 1.0,
648
+ "errors": 0
649
+ },
650
+ {
651
+ "label": "\\sqcap",
652
+ "test_support": 4,
653
+ "training_support": 76,
654
+ "top1": 1.0,
655
+ "top5": 1.0,
656
+ "errors": 0
657
+ },
658
+ {
659
+ "label": "\\phi",
660
+ "test_support": 3,
661
+ "training_support": 76,
662
+ "top1": 1.0,
663
+ "top5": 1.0,
664
+ "errors": 0
665
+ },
666
+ {
667
+ "label": "\\Gamma",
668
+ "test_support": 1,
669
+ "training_support": 76,
670
+ "top1": 1.0,
671
+ "top5": 1.0,
672
+ "errors": 0
673
+ },
674
+ {
675
+ "label": "\\amalg",
676
+ "test_support": 3,
677
+ "training_support": 77,
678
+ "top1": 1.0,
679
+ "top5": 1.0,
680
+ "errors": 0
681
+ },
682
+ {
683
+ "label": "\\kappa",
684
+ "test_support": 3,
685
+ "training_support": 77,
686
+ "top1": 1.0,
687
+ "top5": 1.0,
688
+ "errors": 0
689
+ },
690
+ {
691
+ "label": "\\mathcal{G}",
692
+ "test_support": 3,
693
+ "training_support": 77,
694
+ "top1": 1.0,
695
+ "top5": 1.0,
696
+ "errors": 0
697
+ },
698
+ {
699
+ "label": "\\mathfrak{A}",
700
+ "test_support": 3,
701
+ "training_support": 77,
702
+ "top1": 1.0,
703
+ "top5": 1.0,
704
+ "errors": 0
705
+ },
706
+ {
707
+ "label": "\\mathfrak{X}",
708
+ "test_support": 3,
709
+ "training_support": 77,
710
+ "top1": 1.0,
711
+ "top5": 1.0,
712
+ "errors": 0
713
+ },
714
+ {
715
+ "label": "\\rfloor",
716
+ "test_support": 3,
717
+ "training_support": 77,
718
+ "top1": 1.0,
719
+ "top5": 1.0,
720
+ "errors": 0
721
+ },
722
+ {
723
+ "label": "\\varkappa",
724
+ "test_support": 3,
725
+ "training_support": 77,
726
+ "top1": 0.0,
727
+ "top5": 0.6666666666666666,
728
+ "errors": 3
729
+ },
730
+ {
731
+ "label": "\\iota",
732
+ "test_support": 2,
733
+ "training_support": 77,
734
+ "top1": 1.0,
735
+ "top5": 1.0,
736
+ "errors": 0
737
+ },
738
+ {
739
+ "label": "\\parr",
740
+ "test_support": 2,
741
+ "training_support": 77,
742
+ "top1": 1.0,
743
+ "top5": 1.0,
744
+ "errors": 0
745
+ },
746
+ {
747
+ "label": "\\varrho",
748
+ "test_support": 2,
749
+ "training_support": 77,
750
+ "top1": 1.0,
751
+ "top5": 1.0,
752
+ "errors": 0
753
+ },
754
+ {
755
+ "label": "\\Theta",
756
+ "test_support": 2,
757
+ "training_support": 78,
758
+ "top1": 1.0,
759
+ "top5": 1.0,
760
+ "errors": 0
761
+ },
762
+ {
763
+ "label": "\\Xi",
764
+ "test_support": 2,
765
+ "training_support": 78,
766
+ "top1": 1.0,
767
+ "top5": 1.0,
768
+ "errors": 0
769
+ },
770
+ {
771
+ "label": "\\circledcirc",
772
+ "test_support": 2,
773
+ "training_support": 78,
774
+ "top1": 1.0,
775
+ "top5": 1.0,
776
+ "errors": 0
777
+ },
778
+ {
779
+ "label": "\\dotsc",
780
+ "test_support": 2,
781
+ "training_support": 78,
782
+ "top1": 1.0,
783
+ "top5": 1.0,
784
+ "errors": 0
785
+ },
786
+ {
787
+ "label": "\\epsilon",
788
+ "test_support": 2,
789
+ "training_support": 78,
790
+ "top1": 0.0,
791
+ "top5": 1.0,
792
+ "errors": 2
793
+ },
794
+ {
795
+ "label": "\\oiint",
796
+ "test_support": 2,
797
+ "training_support": 78,
798
+ "top1": 1.0,
799
+ "top5": 1.0,
800
+ "errors": 0
801
+ },
802
+ {
803
+ "label": "\\pitchfork",
804
+ "test_support": 2,
805
+ "training_support": 78,
806
+ "top1": 1.0,
807
+ "top5": 1.0,
808
+ "errors": 0
809
+ },
810
+ {
811
+ "label": "\\zeta",
812
+ "test_support": 2,
813
+ "training_support": 78,
814
+ "top1": 1.0,
815
+ "top5": 1.0,
816
+ "errors": 0
817
+ },
818
+ {
819
+ "label": "\\|",
820
+ "test_support": 2,
821
+ "training_support": 78,
822
+ "top1": 1.0,
823
+ "top5": 1.0,
824
+ "errors": 0
825
+ }
826
+ ],
827
+ "source_bottlenecks": {
828
+ "hwrt": {
829
+ "samples": 552,
830
+ "top1": 0.85326087474823,
831
+ "top5": 0.9909420013427734,
832
+ "shape_family_top1": 0.9202898740768433,
833
+ "same_family_error_rate": 0.4567901234567901,
834
+ "writer_accuracy_p10": 0.7105263157894737,
835
+ "writer_accuracy_minimum": 0.0,
836
+ "top_confusions": [
837
+ {
838
+ "truth": "1",
839
+ "prediction": "I",
840
+ "count": 6
841
+ },
842
+ {
843
+ "truth": "o",
844
+ "prediction": "0",
845
+ "count": 4
846
+ },
847
+ {
848
+ "truth": "O",
849
+ "prediction": "0",
850
+ "count": 4
851
+ },
852
+ {
853
+ "truth": "v",
854
+ "prediction": "V",
855
+ "count": 4
856
+ },
857
+ {
858
+ "truth": "s",
859
+ "prediction": "S",
860
+ "count": 4
861
+ },
862
+ {
863
+ "truth": "z",
864
+ "prediction": "Z",
865
+ "count": 4
866
+ },
867
+ {
868
+ "truth": "9",
869
+ "prediction": "g",
870
+ "count": 3
871
+ },
872
+ {
873
+ "truth": "x",
874
+ "prediction": "X",
875
+ "count": 2
876
+ },
877
+ {
878
+ "truth": "\\subset",
879
+ "prediction": "c",
880
+ "count": 2
881
+ },
882
+ {
883
+ "truth": "X",
884
+ "prediction": "x",
885
+ "count": 2
886
+ },
887
+ {
888
+ "truth": "\\varkappa",
889
+ "prediction": "\\kappa",
890
+ "count": 2
891
+ },
892
+ {
893
+ "truth": "w",
894
+ "prediction": "W",
895
+ "count": 2
896
+ },
897
+ {
898
+ "truth": "0",
899
+ "prediction": "O",
900
+ "count": 1
901
+ },
902
+ {
903
+ "truth": "O",
904
+ "prediction": "\\fullmoon",
905
+ "count": 1
906
+ },
907
+ {
908
+ "truth": "\\odot",
909
+ "prediction": "\\astrosun",
910
+ "count": 1
911
+ },
912
+ {
913
+ "truth": "x",
914
+ "prediction": "\\ae",
915
+ "count": 1
916
+ },
917
+ {
918
+ "truth": "l",
919
+ "prediction": "I",
920
+ "count": 1
921
+ },
922
+ {
923
+ "truth": "L",
924
+ "prediction": "\\lfloor",
925
+ "count": 1
926
+ },
927
+ {
928
+ "truth": "l",
929
+ "prediction": "'",
930
+ "count": 1
931
+ },
932
+ {
933
+ "truth": "\\circ",
934
+ "prediction": "\\fullmoon",
935
+ "count": 1
936
+ },
937
+ {
938
+ "truth": "I",
939
+ "prediction": "|",
940
+ "count": 1
941
+ },
942
+ {
943
+ "truth": "I",
944
+ "prediction": "\\mid",
945
+ "count": 1
946
+ },
947
+ {
948
+ "truth": "1",
949
+ "prediction": "\\rceil",
950
+ "count": 1
951
+ },
952
+ {
953
+ "truth": "\\&",
954
+ "prediction": "\\with",
955
+ "count": 1
956
+ },
957
+ {
958
+ "truth": "U",
959
+ "prediction": "\\iota",
960
+ "count": 1
961
+ },
962
+ {
963
+ "truth": "o",
964
+ "prediction": "\\fullmoon",
965
+ "count": 1
966
+ },
967
+ {
968
+ "truth": "H",
969
+ "prediction": "\\varkappa",
970
+ "count": 1
971
+ },
972
+ {
973
+ "truth": "\\dots",
974
+ "prediction": "-",
975
+ "count": 1
976
+ },
977
+ {
978
+ "truth": "9",
979
+ "prediction": "0",
980
+ "count": 1
981
+ },
982
+ {
983
+ "truth": "x",
984
+ "prediction": "\\chi",
985
+ "count": 1
986
+ }
987
+ ],
988
+ "highest_error_labels": [
989
+ {
990
+ "label": "1",
991
+ "test_support": 14,
992
+ "training_support": 57,
993
+ "top1": 0.5,
994
+ "top5": 1.0,
995
+ "errors": 7
996
+ },
997
+ {
998
+ "label": "o",
999
+ "test_support": 7,
1000
+ "training_support": 46,
1001
+ "top1": 0.14285714285714285,
1002
+ "top5": 0.8571428571428571,
1003
+ "errors": 6
1004
+ },
1005
+ {
1006
+ "label": "O",
1007
+ "test_support": 5,
1008
+ "training_support": 69,
1009
+ "top1": 0.0,
1010
+ "top5": 1.0,
1011
+ "errors": 5
1012
+ },
1013
+ {
1014
+ "label": "l",
1015
+ "test_support": 5,
1016
+ "training_support": 43,
1017
+ "top1": 0.0,
1018
+ "top5": 0.8,
1019
+ "errors": 5
1020
+ },
1021
+ {
1022
+ "label": "z",
1023
+ "test_support": 7,
1024
+ "training_support": 45,
1025
+ "top1": 0.2857142857142857,
1026
+ "top5": 1.0,
1027
+ "errors": 5
1028
+ },
1029
+ {
1030
+ "label": "x",
1031
+ "test_support": 8,
1032
+ "training_support": 48,
1033
+ "top1": 0.375,
1034
+ "top5": 0.875,
1035
+ "errors": 5
1036
+ },
1037
+ {
1038
+ "label": "v",
1039
+ "test_support": 5,
1040
+ "training_support": 49,
1041
+ "top1": 0.2,
1042
+ "top5": 1.0,
1043
+ "errors": 4
1044
+ },
1045
+ {
1046
+ "label": "9",
1047
+ "test_support": 6,
1048
+ "training_support": 70,
1049
+ "top1": 0.3333333333333333,
1050
+ "top5": 1.0,
1051
+ "errors": 4
1052
+ },
1053
+ {
1054
+ "label": "s",
1055
+ "test_support": 7,
1056
+ "training_support": 43,
1057
+ "top1": 0.42857142857142855,
1058
+ "top5": 1.0,
1059
+ "errors": 4
1060
+ },
1061
+ {
1062
+ "label": "\\varkappa",
1063
+ "test_support": 3,
1064
+ "training_support": 77,
1065
+ "top1": 0.0,
1066
+ "top5": 0.6666666666666666,
1067
+ "errors": 3
1068
+ },
1069
+ {
1070
+ "label": "X",
1071
+ "test_support": 5,
1072
+ "training_support": 41,
1073
+ "top1": 0.4,
1074
+ "top5": 1.0,
1075
+ "errors": 3
1076
+ },
1077
+ {
1078
+ "label": "\\epsilon",
1079
+ "test_support": 2,
1080
+ "training_support": 78,
1081
+ "top1": 0.0,
1082
+ "top5": 1.0,
1083
+ "errors": 2
1084
+ },
1085
+ {
1086
+ "label": "\\subset",
1087
+ "test_support": 4,
1088
+ "training_support": 75,
1089
+ "top1": 0.5,
1090
+ "top5": 1.0,
1091
+ "errors": 2
1092
+ },
1093
+ {
1094
+ "label": "w",
1095
+ "test_support": 5,
1096
+ "training_support": 44,
1097
+ "top1": 0.6,
1098
+ "top5": 1.0,
1099
+ "errors": 2
1100
+ },
1101
+ {
1102
+ "label": "I",
1103
+ "test_support": 9,
1104
+ "training_support": 69,
1105
+ "top1": 0.7777777777777778,
1106
+ "top5": 1.0,
1107
+ "errors": 2
1108
+ },
1109
+ {
1110
+ "label": ".",
1111
+ "test_support": 1,
1112
+ "training_support": 59,
1113
+ "top1": 0.0,
1114
+ "top5": 1.0,
1115
+ "errors": 1
1116
+ },
1117
+ {
1118
+ "label": "\\&",
1119
+ "test_support": 1,
1120
+ "training_support": 79,
1121
+ "top1": 0.0,
1122
+ "top5": 1.0,
1123
+ "errors": 1
1124
+ },
1125
+ {
1126
+ "label": "\\circ",
1127
+ "test_support": 1,
1128
+ "training_support": 79,
1129
+ "top1": 0.0,
1130
+ "top5": 1.0,
1131
+ "errors": 1
1132
+ },
1133
+ {
1134
+ "label": "\\dots",
1135
+ "test_support": 1,
1136
+ "training_support": 78,
1137
+ "top1": 0.0,
1138
+ "top5": 1.0,
1139
+ "errors": 1
1140
+ },
1141
+ {
1142
+ "label": "\\ell",
1143
+ "test_support": 1,
1144
+ "training_support": 79,
1145
+ "top1": 0.0,
1146
+ "top5": 1.0,
1147
+ "errors": 1
1148
+ },
1149
+ {
1150
+ "label": "\\fint",
1151
+ "test_support": 1,
1152
+ "training_support": 79,
1153
+ "top1": 0.0,
1154
+ "top5": 1.0,
1155
+ "errors": 1
1156
+ },
1157
+ {
1158
+ "label": "\\mathbb{Q}",
1159
+ "test_support": 1,
1160
+ "training_support": 44,
1161
+ "top1": 0.0,
1162
+ "top5": 1.0,
1163
+ "errors": 1
1164
+ },
1165
+ {
1166
+ "label": "\\mid",
1167
+ "test_support": 1,
1168
+ "training_support": 79,
1169
+ "top1": 0.0,
1170
+ "top5": 1.0,
1171
+ "errors": 1
1172
+ },
1173
+ {
1174
+ "label": "\\odot",
1175
+ "test_support": 1,
1176
+ "training_support": 79,
1177
+ "top1": 0.0,
1178
+ "top5": 1.0,
1179
+ "errors": 1
1180
+ },
1181
+ {
1182
+ "label": "\\sqrt{}",
1183
+ "test_support": 1,
1184
+ "training_support": 79,
1185
+ "top1": 0.0,
1186
+ "top5": 1.0,
1187
+ "errors": 1
1188
+ },
1189
+ {
1190
+ "label": "\\vee",
1191
+ "test_support": 1,
1192
+ "training_support": 79,
1193
+ "top1": 0.0,
1194
+ "top5": 1.0,
1195
+ "errors": 1
1196
+ },
1197
+ {
1198
+ "label": "|",
1199
+ "test_support": 1,
1200
+ "training_support": 79,
1201
+ "top1": 0.0,
1202
+ "top5": 1.0,
1203
+ "errors": 1
1204
+ },
1205
+ {
1206
+ "label": "0",
1207
+ "test_support": 3,
1208
+ "training_support": 75,
1209
+ "top1": 0.6666666666666666,
1210
+ "top5": 1.0,
1211
+ "errors": 1
1212
+ },
1213
+ {
1214
+ "label": "H",
1215
+ "test_support": 3,
1216
+ "training_support": 50,
1217
+ "top1": 0.6666666666666666,
1218
+ "top5": 1.0,
1219
+ "errors": 1
1220
+ },
1221
+ {
1222
+ "label": "U",
1223
+ "test_support": 5,
1224
+ "training_support": 46,
1225
+ "top1": 0.8,
1226
+ "top5": 1.0,
1227
+ "errors": 1
1228
+ },
1229
+ {
1230
+ "label": "i",
1231
+ "test_support": 6,
1232
+ "training_support": 44,
1233
+ "top1": 0.8333333333333334,
1234
+ "top5": 0.8333333333333334,
1235
+ "errors": 1
1236
+ },
1237
+ {
1238
+ "label": "u",
1239
+ "test_support": 6,
1240
+ "training_support": 43,
1241
+ "top1": 0.8333333333333334,
1242
+ "top5": 1.0,
1243
+ "errors": 1
1244
+ },
1245
+ {
1246
+ "label": "5",
1247
+ "test_support": 7,
1248
+ "training_support": 60,
1249
+ "top1": 0.8571428571428571,
1250
+ "top5": 1.0,
1251
+ "errors": 1
1252
+ },
1253
+ {
1254
+ "label": "P",
1255
+ "test_support": 7,
1256
+ "training_support": 55,
1257
+ "top1": 0.8571428571428571,
1258
+ "top5": 1.0,
1259
+ "errors": 1
1260
+ },
1261
+ {
1262
+ "label": "p",
1263
+ "test_support": 7,
1264
+ "training_support": 41,
1265
+ "top1": 0.8571428571428571,
1266
+ "top5": 1.0,
1267
+ "errors": 1
1268
+ },
1269
+ {
1270
+ "label": "a",
1271
+ "test_support": 9,
1272
+ "training_support": 67,
1273
+ "top1": 0.8888888888888888,
1274
+ "top5": 1.0,
1275
+ "errors": 1
1276
+ },
1277
+ {
1278
+ "label": "L",
1279
+ "test_support": 11,
1280
+ "training_support": 66,
1281
+ "top1": 0.9090909090909091,
1282
+ "top5": 1.0,
1283
+ "errors": 1
1284
+ },
1285
+ {
1286
+ "label": "%",
1287
+ "test_support": 1,
1288
+ "training_support": 79,
1289
+ "top1": 1.0,
1290
+ "top5": 1.0,
1291
+ "errors": 0
1292
+ },
1293
+ {
1294
+ "label": "+",
1295
+ "test_support": 16,
1296
+ "training_support": 58,
1297
+ "top1": 1.0,
1298
+ "top5": 1.0,
1299
+ "errors": 0
1300
+ },
1301
+ {
1302
+ "label": "-",
1303
+ "test_support": 10,
1304
+ "training_support": 66,
1305
+ "top1": 1.0,
1306
+ "top5": 1.0,
1307
+ "errors": 0
1308
+ }
1309
+ ],
1310
+ "lowest_supported_labels": [
1311
+ {
1312
+ "label": "j",
1313
+ "test_support": 7,
1314
+ "training_support": 37,
1315
+ "top1": 1.0,
1316
+ "top5": 1.0,
1317
+ "errors": 0
1318
+ },
1319
+ {
1320
+ "label": "B",
1321
+ "test_support": 3,
1322
+ "training_support": 37,
1323
+ "top1": 1.0,
1324
+ "top5": 1.0,
1325
+ "errors": 0
1326
+ },
1327
+ {
1328
+ "label": "D",
1329
+ "test_support": 9,
1330
+ "training_support": 39,
1331
+ "top1": 1.0,
1332
+ "top5": 1.0,
1333
+ "errors": 0
1334
+ },
1335
+ {
1336
+ "label": "b",
1337
+ "test_support": 8,
1338
+ "training_support": 41,
1339
+ "top1": 1.0,
1340
+ "top5": 1.0,
1341
+ "errors": 0
1342
+ },
1343
+ {
1344
+ "label": "g",
1345
+ "test_support": 7,
1346
+ "training_support": 41,
1347
+ "top1": 1.0,
1348
+ "top5": 1.0,
1349
+ "errors": 0
1350
+ },
1351
+ {
1352
+ "label": "p",
1353
+ "test_support": 7,
1354
+ "training_support": 41,
1355
+ "top1": 0.8571428571428571,
1356
+ "top5": 1.0,
1357
+ "errors": 1
1358
+ },
1359
+ {
1360
+ "label": "X",
1361
+ "test_support": 5,
1362
+ "training_support": 41,
1363
+ "top1": 0.4,
1364
+ "top5": 1.0,
1365
+ "errors": 3
1366
+ },
1367
+ {
1368
+ "label": "\\mathbb{N}",
1369
+ "test_support": 2,
1370
+ "training_support": 41,
1371
+ "top1": 1.0,
1372
+ "top5": 1.0,
1373
+ "errors": 0
1374
+ },
1375
+ {
1376
+ "label": "A",
1377
+ "test_support": 10,
1378
+ "training_support": 42,
1379
+ "top1": 1.0,
1380
+ "top5": 1.0,
1381
+ "errors": 0
1382
+ },
1383
+ {
1384
+ "label": "m",
1385
+ "test_support": 7,
1386
+ "training_support": 42,
1387
+ "top1": 1.0,
1388
+ "top5": 1.0,
1389
+ "errors": 0
1390
+ },
1391
+ {
1392
+ "label": "T",
1393
+ "test_support": 5,
1394
+ "training_support": 42,
1395
+ "top1": 1.0,
1396
+ "top5": 1.0,
1397
+ "errors": 0
1398
+ },
1399
+ {
1400
+ "label": "s",
1401
+ "test_support": 7,
1402
+ "training_support": 43,
1403
+ "top1": 0.42857142857142855,
1404
+ "top5": 1.0,
1405
+ "errors": 4
1406
+ },
1407
+ {
1408
+ "label": "4",
1409
+ "test_support": 6,
1410
+ "training_support": 43,
1411
+ "top1": 1.0,
1412
+ "top5": 1.0,
1413
+ "errors": 0
1414
+ },
1415
+ {
1416
+ "label": "u",
1417
+ "test_support": 6,
1418
+ "training_support": 43,
1419
+ "top1": 0.8333333333333334,
1420
+ "top5": 1.0,
1421
+ "errors": 1
1422
+ },
1423
+ {
1424
+ "label": "l",
1425
+ "test_support": 5,
1426
+ "training_support": 43,
1427
+ "top1": 0.0,
1428
+ "top5": 0.8,
1429
+ "errors": 5
1430
+ },
1431
+ {
1432
+ "label": "e",
1433
+ "test_support": 10,
1434
+ "training_support": 44,
1435
+ "top1": 1.0,
1436
+ "top5": 1.0,
1437
+ "errors": 0
1438
+ },
1439
+ {
1440
+ "label": "n",
1441
+ "test_support": 7,
1442
+ "training_support": 44,
1443
+ "top1": 1.0,
1444
+ "top5": 1.0,
1445
+ "errors": 0
1446
+ },
1447
+ {
1448
+ "label": "i",
1449
+ "test_support": 6,
1450
+ "training_support": 44,
1451
+ "top1": 0.8333333333333334,
1452
+ "top5": 0.8333333333333334,
1453
+ "errors": 1
1454
+ },
1455
+ {
1456
+ "label": "F",
1457
+ "test_support": 5,
1458
+ "training_support": 44,
1459
+ "top1": 1.0,
1460
+ "top5": 1.0,
1461
+ "errors": 0
1462
+ },
1463
+ {
1464
+ "label": "w",
1465
+ "test_support": 5,
1466
+ "training_support": 44,
1467
+ "top1": 0.6,
1468
+ "top5": 1.0,
1469
+ "errors": 2
1470
+ },
1471
+ {
1472
+ "label": "\\mathbb{R}",
1473
+ "test_support": 4,
1474
+ "training_support": 44,
1475
+ "top1": 1.0,
1476
+ "top5": 1.0,
1477
+ "errors": 0
1478
+ },
1479
+ {
1480
+ "label": "h",
1481
+ "test_support": 4,
1482
+ "training_support": 44,
1483
+ "top1": 1.0,
1484
+ "top5": 1.0,
1485
+ "errors": 0
1486
+ },
1487
+ {
1488
+ "label": "E",
1489
+ "test_support": 3,
1490
+ "training_support": 44,
1491
+ "top1": 1.0,
1492
+ "top5": 1.0,
1493
+ "errors": 0
1494
+ },
1495
+ {
1496
+ "label": "\\mathbb{Q}",
1497
+ "test_support": 1,
1498
+ "training_support": 44,
1499
+ "top1": 0.0,
1500
+ "top5": 1.0,
1501
+ "errors": 1
1502
+ },
1503
+ {
1504
+ "label": "z",
1505
+ "test_support": 7,
1506
+ "training_support": 45,
1507
+ "top1": 0.2857142857142857,
1508
+ "top5": 1.0,
1509
+ "errors": 5
1510
+ },
1511
+ {
1512
+ "label": "d",
1513
+ "test_support": 5,
1514
+ "training_support": 45,
1515
+ "top1": 1.0,
1516
+ "top5": 1.0,
1517
+ "errors": 0
1518
+ },
1519
+ {
1520
+ "label": "Y",
1521
+ "test_support": 3,
1522
+ "training_support": 45,
1523
+ "top1": 1.0,
1524
+ "top5": 1.0,
1525
+ "errors": 0
1526
+ },
1527
+ {
1528
+ "label": "o",
1529
+ "test_support": 7,
1530
+ "training_support": 46,
1531
+ "top1": 0.14285714285714285,
1532
+ "top5": 0.8571428571428571,
1533
+ "errors": 6
1534
+ },
1535
+ {
1536
+ "label": "U",
1537
+ "test_support": 5,
1538
+ "training_support": 46,
1539
+ "top1": 0.8,
1540
+ "top5": 1.0,
1541
+ "errors": 1
1542
+ },
1543
+ {
1544
+ "label": "r",
1545
+ "test_support": 5,
1546
+ "training_support": 46,
1547
+ "top1": 1.0,
1548
+ "top5": 1.0,
1549
+ "errors": 0
1550
+ },
1551
+ {
1552
+ "label": "y",
1553
+ "test_support": 5,
1554
+ "training_support": 46,
1555
+ "top1": 1.0,
1556
+ "top5": 1.0,
1557
+ "errors": 0
1558
+ },
1559
+ {
1560
+ "label": "V",
1561
+ "test_support": 3,
1562
+ "training_support": 47,
1563
+ "top1": 1.0,
1564
+ "top5": 1.0,
1565
+ "errors": 0
1566
+ },
1567
+ {
1568
+ "label": "k",
1569
+ "test_support": 3,
1570
+ "training_support": 47,
1571
+ "top1": 1.0,
1572
+ "top5": 1.0,
1573
+ "errors": 0
1574
+ },
1575
+ {
1576
+ "label": "f",
1577
+ "test_support": 8,
1578
+ "training_support": 48,
1579
+ "top1": 1.0,
1580
+ "top5": 1.0,
1581
+ "errors": 0
1582
+ },
1583
+ {
1584
+ "label": "x",
1585
+ "test_support": 8,
1586
+ "training_support": 48,
1587
+ "top1": 0.375,
1588
+ "top5": 0.875,
1589
+ "errors": 5
1590
+ },
1591
+ {
1592
+ "label": "v",
1593
+ "test_support": 5,
1594
+ "training_support": 49,
1595
+ "top1": 0.2,
1596
+ "top5": 1.0,
1597
+ "errors": 4
1598
+ },
1599
+ {
1600
+ "label": "S",
1601
+ "test_support": 5,
1602
+ "training_support": 50,
1603
+ "top1": 1.0,
1604
+ "top5": 1.0,
1605
+ "errors": 0
1606
+ },
1607
+ {
1608
+ "label": "W",
1609
+ "test_support": 4,
1610
+ "training_support": 50,
1611
+ "top1": 1.0,
1612
+ "top5": 1.0,
1613
+ "errors": 0
1614
+ },
1615
+ {
1616
+ "label": "H",
1617
+ "test_support": 3,
1618
+ "training_support": 50,
1619
+ "top1": 0.6666666666666666,
1620
+ "top5": 1.0,
1621
+ "errors": 1
1622
+ },
1623
+ {
1624
+ "label": "c",
1625
+ "test_support": 5,
1626
+ "training_support": 51,
1627
+ "top1": 1.0,
1628
+ "top5": 1.0,
1629
+ "errors": 0
1630
+ }
1631
+ ]
1632
+ },
1633
+ "uci-pendigits": {
1634
+ "samples": 3498,
1635
+ "top1": 0.9482561349868774,
1636
+ "top5": 0.9942824244499207,
1637
+ "shape_family_top1": 0.9491137862205505,
1638
+ "same_family_error_rate": 0.016574585635359115,
1639
+ "writer_accuracy_p10": 0.948256146369354,
1640
+ "writer_accuracy_minimum": 0.948256146369354,
1641
+ "top_confusions": [
1642
+ {
1643
+ "truth": "1",
1644
+ "prediction": "2",
1645
+ "count": 38
1646
+ },
1647
+ {
1648
+ "truth": "7",
1649
+ "prediction": "1",
1650
+ "count": 31
1651
+ },
1652
+ {
1653
+ "truth": "3",
1654
+ "prediction": "7",
1655
+ "count": 10
1656
+ },
1657
+ {
1658
+ "truth": "5",
1659
+ "prediction": "9",
1660
+ "count": 9
1661
+ },
1662
+ {
1663
+ "truth": "2",
1664
+ "prediction": "1",
1665
+ "count": 8
1666
+ },
1667
+ {
1668
+ "truth": "9",
1669
+ "prediction": "3",
1670
+ "count": 8
1671
+ },
1672
+ {
1673
+ "truth": "5",
1674
+ "prediction": "3",
1675
+ "count": 8
1676
+ },
1677
+ {
1678
+ "truth": "8",
1679
+ "prediction": "9",
1680
+ "count": 6
1681
+ },
1682
+ {
1683
+ "truth": "7",
1684
+ "prediction": "2",
1685
+ "count": 5
1686
+ },
1687
+ {
1688
+ "truth": "4",
1689
+ "prediction": "5",
1690
+ "count": 5
1691
+ },
1692
+ {
1693
+ "truth": "3",
1694
+ "prediction": "1",
1695
+ "count": 5
1696
+ },
1697
+ {
1698
+ "truth": "9",
1699
+ "prediction": "\\partial",
1700
+ "count": 5
1701
+ },
1702
+ {
1703
+ "truth": "8",
1704
+ "prediction": "5",
1705
+ "count": 4
1706
+ },
1707
+ {
1708
+ "truth": "4",
1709
+ "prediction": "6",
1710
+ "count": 3
1711
+ },
1712
+ {
1713
+ "truth": "7",
1714
+ "prediction": "8",
1715
+ "count": 3
1716
+ },
1717
+ {
1718
+ "truth": "9",
1719
+ "prediction": "7",
1720
+ "count": 3
1721
+ },
1722
+ {
1723
+ "truth": "1",
1724
+ "prediction": "L",
1725
+ "count": 3
1726
+ },
1727
+ {
1728
+ "truth": "8",
1729
+ "prediction": "0",
1730
+ "count": 2
1731
+ },
1732
+ {
1733
+ "truth": "9",
1734
+ "prediction": "8",
1735
+ "count": 2
1736
+ },
1737
+ {
1738
+ "truth": "5",
1739
+ "prediction": "8",
1740
+ "count": 2
1741
+ },
1742
+ {
1743
+ "truth": "6",
1744
+ "prediction": "1",
1745
+ "count": 2
1746
+ },
1747
+ {
1748
+ "truth": "8",
1749
+ "prediction": "\\triangleright",
1750
+ "count": 1
1751
+ },
1752
+ {
1753
+ "truth": "3",
1754
+ "prediction": "5",
1755
+ "count": 1
1756
+ },
1757
+ {
1758
+ "truth": "8",
1759
+ "prediction": "4",
1760
+ "count": 1
1761
+ },
1762
+ {
1763
+ "truth": "8",
1764
+ "prediction": "6",
1765
+ "count": 1
1766
+ },
1767
+ {
1768
+ "truth": "2",
1769
+ "prediction": "6",
1770
+ "count": 1
1771
+ },
1772
+ {
1773
+ "truth": "8",
1774
+ "prediction": "\\Delta",
1775
+ "count": 1
1776
+ },
1777
+ {
1778
+ "truth": "1",
1779
+ "prediction": "7",
1780
+ "count": 1
1781
+ },
1782
+ {
1783
+ "truth": "8",
1784
+ "prediction": "\\vartriangle",
1785
+ "count": 1
1786
+ },
1787
+ {
1788
+ "truth": "1",
1789
+ "prediction": "9",
1790
+ "count": 1
1791
+ }
1792
+ ],
1793
+ "highest_error_labels": [
1794
+ {
1795
+ "label": "1",
1796
+ "test_support": 364,
1797
+ "training_support": 779,
1798
+ "top1": 0.8736263736263736,
1799
+ "top5": 0.9945054945054945,
1800
+ "errors": 46
1801
+ },
1802
+ {
1803
+ "label": "7",
1804
+ "test_support": 364,
1805
+ "training_support": 778,
1806
+ "top1": 0.8901098901098901,
1807
+ "top5": 0.9697802197802198,
1808
+ "errors": 40
1809
+ },
1810
+ {
1811
+ "label": "5",
1812
+ "test_support": 335,
1813
+ "training_support": 720,
1814
+ "top1": 0.9373134328358209,
1815
+ "top5": 1.0,
1816
+ "errors": 21
1817
+ },
1818
+ {
1819
+ "label": "9",
1820
+ "test_support": 336,
1821
+ "training_support": 719,
1822
+ "top1": 0.9434523809523809,
1823
+ "top5": 0.9910714285714286,
1824
+ "errors": 19
1825
+ },
1826
+ {
1827
+ "label": "3",
1828
+ "test_support": 336,
1829
+ "training_support": 719,
1830
+ "top1": 0.9494047619047619,
1831
+ "top5": 0.9970238095238095,
1832
+ "errors": 17
1833
+ },
1834
+ {
1835
+ "label": "8",
1836
+ "test_support": 336,
1837
+ "training_support": 719,
1838
+ "top1": 0.9494047619047619,
1839
+ "top5": 1.0,
1840
+ "errors": 17
1841
+ },
1842
+ {
1843
+ "label": "2",
1844
+ "test_support": 364,
1845
+ "training_support": 780,
1846
+ "top1": 0.9752747252747253,
1847
+ "top5": 0.9917582417582418,
1848
+ "errors": 9
1849
+ },
1850
+ {
1851
+ "label": "4",
1852
+ "test_support": 364,
1853
+ "training_support": 780,
1854
+ "top1": 0.9752747252747253,
1855
+ "top5": 1.0,
1856
+ "errors": 9
1857
+ },
1858
+ {
1859
+ "label": "6",
1860
+ "test_support": 336,
1861
+ "training_support": 720,
1862
+ "top1": 0.9940476190476191,
1863
+ "top5": 1.0,
1864
+ "errors": 2
1865
+ },
1866
+ {
1867
+ "label": "0",
1868
+ "test_support": 363,
1869
+ "training_support": 780,
1870
+ "top1": 0.9972451790633609,
1871
+ "top5": 1.0,
1872
+ "errors": 1
1873
+ }
1874
+ ],
1875
+ "lowest_supported_labels": [
1876
+ {
1877
+ "label": "3",
1878
+ "test_support": 336,
1879
+ "training_support": 719,
1880
+ "top1": 0.9494047619047619,
1881
+ "top5": 0.9970238095238095,
1882
+ "errors": 17
1883
+ },
1884
+ {
1885
+ "label": "8",
1886
+ "test_support": 336,
1887
+ "training_support": 719,
1888
+ "top1": 0.9494047619047619,
1889
+ "top5": 1.0,
1890
+ "errors": 17
1891
+ },
1892
+ {
1893
+ "label": "9",
1894
+ "test_support": 336,
1895
+ "training_support": 719,
1896
+ "top1": 0.9434523809523809,
1897
+ "top5": 0.9910714285714286,
1898
+ "errors": 19
1899
+ },
1900
+ {
1901
+ "label": "6",
1902
+ "test_support": 336,
1903
+ "training_support": 720,
1904
+ "top1": 0.9940476190476191,
1905
+ "top5": 1.0,
1906
+ "errors": 2
1907
+ },
1908
+ {
1909
+ "label": "5",
1910
+ "test_support": 335,
1911
+ "training_support": 720,
1912
+ "top1": 0.9373134328358209,
1913
+ "top5": 1.0,
1914
+ "errors": 21
1915
+ },
1916
+ {
1917
+ "label": "7",
1918
+ "test_support": 364,
1919
+ "training_support": 778,
1920
+ "top1": 0.8901098901098901,
1921
+ "top5": 0.9697802197802198,
1922
+ "errors": 40
1923
+ },
1924
+ {
1925
+ "label": "1",
1926
+ "test_support": 364,
1927
+ "training_support": 779,
1928
+ "top1": 0.8736263736263736,
1929
+ "top5": 0.9945054945054945,
1930
+ "errors": 46
1931
+ },
1932
+ {
1933
+ "label": "2",
1934
+ "test_support": 364,
1935
+ "training_support": 780,
1936
+ "top1": 0.9752747252747253,
1937
+ "top5": 0.9917582417582418,
1938
+ "errors": 9
1939
+ },
1940
+ {
1941
+ "label": "4",
1942
+ "test_support": 364,
1943
+ "training_support": 780,
1944
+ "top1": 0.9752747252747253,
1945
+ "top5": 1.0,
1946
+ "errors": 9
1947
+ },
1948
+ {
1949
+ "label": "0",
1950
+ "test_support": 363,
1951
+ "training_support": 780,
1952
+ "top1": 0.9972451790633609,
1953
+ "top5": 1.0,
1954
+ "errors": 1
1955
+ }
1956
+ ]
1957
+ },
1958
+ "uci-uji-pen-v2": {
1959
+ "samples": 2981,
1960
+ "top1": 0.759141206741333,
1961
+ "top5": 0.9493458867073059,
1962
+ "shape_family_top1": 0.8601140379905701,
1963
+ "same_family_error_rate": 0.4192200557103064,
1964
+ "writer_accuracy_p10": 0.58,
1965
+ "writer_accuracy_minimum": 0.5333333333333333,
1966
+ "top_confusions": [
1967
+ {
1968
+ "truth": "c",
1969
+ "prediction": "C",
1970
+ "count": 32
1971
+ },
1972
+ {
1973
+ "truth": "s",
1974
+ "prediction": "S",
1975
+ "count": 26
1976
+ },
1977
+ {
1978
+ "truth": "x",
1979
+ "prediction": "X",
1980
+ "count": 25
1981
+ },
1982
+ {
1983
+ "truth": "o",
1984
+ "prediction": "O",
1985
+ "count": 16
1986
+ },
1987
+ {
1988
+ "truth": "P",
1989
+ "prediction": "p",
1990
+ "count": 14
1991
+ },
1992
+ {
1993
+ "truth": "W",
1994
+ "prediction": "w",
1995
+ "count": 14
1996
+ },
1997
+ {
1998
+ "truth": "w",
1999
+ "prediction": "W",
2000
+ "count": 13
2001
+ },
2002
+ {
2003
+ "truth": "Z",
2004
+ "prediction": "z",
2005
+ "count": 12
2006
+ },
2007
+ {
2008
+ "truth": "z",
2009
+ "prediction": "Z",
2010
+ "count": 12
2011
+ },
2012
+ {
2013
+ "truth": "O",
2014
+ "prediction": "o",
2015
+ "count": 10
2016
+ },
2017
+ {
2018
+ "truth": "0",
2019
+ "prediction": "O",
2020
+ "count": 9
2021
+ },
2022
+ {
2023
+ "truth": "v",
2024
+ "prediction": "V",
2025
+ "count": 9
2026
+ },
2027
+ {
2028
+ "truth": "O",
2029
+ "prediction": "0",
2030
+ "count": 8
2031
+ },
2032
+ {
2033
+ "truth": "V",
2034
+ "prediction": "v",
2035
+ "count": 7
2036
+ },
2037
+ {
2038
+ "truth": "Y",
2039
+ "prediction": "y",
2040
+ "count": 7
2041
+ },
2042
+ {
2043
+ "truth": ",",
2044
+ "prediction": ")",
2045
+ "count": 7
2046
+ },
2047
+ {
2048
+ "truth": "'",
2049
+ "prediction": ",",
2050
+ "count": 7
2051
+ },
2052
+ {
2053
+ "truth": "k",
2054
+ "prediction": "K",
2055
+ "count": 7
2056
+ },
2057
+ {
2058
+ "truth": "9",
2059
+ "prediction": "q",
2060
+ "count": 7
2061
+ },
2062
+ {
2063
+ "truth": "q",
2064
+ "prediction": "9",
2065
+ "count": 6
2066
+ },
2067
+ {
2068
+ "truth": "w",
2069
+ "prediction": "\\omega",
2070
+ "count": 6
2071
+ },
2072
+ {
2073
+ "truth": "0",
2074
+ "prediction": "o",
2075
+ "count": 6
2076
+ },
2077
+ {
2078
+ "truth": "K",
2079
+ "prediction": "k",
2080
+ "count": 6
2081
+ },
2082
+ {
2083
+ "truth": "y",
2084
+ "prediction": "Y",
2085
+ "count": 6
2086
+ },
2087
+ {
2088
+ "truth": "L",
2089
+ "prediction": "\\mathcal{L}",
2090
+ "count": 5
2091
+ },
2092
+ {
2093
+ "truth": "M",
2094
+ "prediction": "m",
2095
+ "count": 5
2096
+ },
2097
+ {
2098
+ "truth": "S",
2099
+ "prediction": "\\mathcal{S}",
2100
+ "count": 5
2101
+ },
2102
+ {
2103
+ "truth": "U",
2104
+ "prediction": "u",
2105
+ "count": 5
2106
+ },
2107
+ {
2108
+ "truth": "1",
2109
+ "prediction": "l",
2110
+ "count": 5
2111
+ },
2112
+ {
2113
+ "truth": "'",
2114
+ "prediction": ")",
2115
+ "count": 5
2116
+ }
2117
+ ],
2118
+ "highest_error_labels": [
2119
+ {
2120
+ "label": "x",
2121
+ "test_support": 40,
2122
+ "training_support": 72,
2123
+ "top1": 0.125,
2124
+ "top5": 0.875,
2125
+ "errors": 35
2126
+ },
2127
+ {
2128
+ "label": "s",
2129
+ "test_support": 40,
2130
+ "training_support": 72,
2131
+ "top1": 0.15,
2132
+ "top5": 0.9,
2133
+ "errors": 34
2134
+ },
2135
+ {
2136
+ "label": "c",
2137
+ "test_support": 40,
2138
+ "training_support": 72,
2139
+ "top1": 0.175,
2140
+ "top5": 1.0,
2141
+ "errors": 33
2142
+ },
2143
+ {
2144
+ "label": "'",
2145
+ "test_support": 40,
2146
+ "training_support": 72,
2147
+ "top1": 0.225,
2148
+ "top5": 0.825,
2149
+ "errors": 31
2150
+ },
2151
+ {
2152
+ "label": "o",
2153
+ "test_support": 40,
2154
+ "training_support": 72,
2155
+ "top1": 0.3,
2156
+ "top5": 0.925,
2157
+ "errors": 28
2158
+ },
2159
+ {
2160
+ "label": "z",
2161
+ "test_support": 40,
2162
+ "training_support": 72,
2163
+ "top1": 0.475,
2164
+ "top5": 0.9,
2165
+ "errors": 21
2166
+ },
2167
+ {
2168
+ "label": ".",
2169
+ "test_support": 21,
2170
+ "training_support": 44,
2171
+ "top1": 0.047619047619047616,
2172
+ "top5": 0.3333333333333333,
2173
+ "errors": 20
2174
+ },
2175
+ {
2176
+ "label": "O",
2177
+ "test_support": 40,
2178
+ "training_support": 72,
2179
+ "top1": 0.5,
2180
+ "top5": 0.95,
2181
+ "errors": 20
2182
+ },
2183
+ {
2184
+ "label": "P",
2185
+ "test_support": 40,
2186
+ "training_support": 72,
2187
+ "top1": 0.5,
2188
+ "top5": 0.95,
2189
+ "errors": 20
2190
+ },
2191
+ {
2192
+ "label": "w",
2193
+ "test_support": 40,
2194
+ "training_support": 72,
2195
+ "top1": 0.5,
2196
+ "top5": 0.975,
2197
+ "errors": 20
2198
+ },
2199
+ {
2200
+ "label": "v",
2201
+ "test_support": 40,
2202
+ "training_support": 72,
2203
+ "top1": 0.525,
2204
+ "top5": 1.0,
2205
+ "errors": 19
2206
+ },
2207
+ {
2208
+ "label": "Z",
2209
+ "test_support": 40,
2210
+ "training_support": 72,
2211
+ "top1": 0.55,
2212
+ "top5": 0.9,
2213
+ "errors": 18
2214
+ },
2215
+ {
2216
+ "label": ",",
2217
+ "test_support": 40,
2218
+ "training_support": 72,
2219
+ "top1": 0.6,
2220
+ "top5": 0.75,
2221
+ "errors": 16
2222
+ },
2223
+ {
2224
+ "label": "q",
2225
+ "test_support": 40,
2226
+ "training_support": 72,
2227
+ "top1": 0.6,
2228
+ "top5": 0.925,
2229
+ "errors": 16
2230
+ },
2231
+ {
2232
+ "label": "0",
2233
+ "test_support": 40,
2234
+ "training_support": 72,
2235
+ "top1": 0.625,
2236
+ "top5": 0.975,
2237
+ "errors": 15
2238
+ },
2239
+ {
2240
+ "label": "V",
2241
+ "test_support": 40,
2242
+ "training_support": 72,
2243
+ "top1": 0.625,
2244
+ "top5": 0.95,
2245
+ "errors": 15
2246
+ },
2247
+ {
2248
+ "label": "W",
2249
+ "test_support": 40,
2250
+ "training_support": 72,
2251
+ "top1": 0.65,
2252
+ "top5": 1.0,
2253
+ "errors": 14
2254
+ },
2255
+ {
2256
+ "label": "p",
2257
+ "test_support": 40,
2258
+ "training_support": 72,
2259
+ "top1": 0.65,
2260
+ "top5": 0.95,
2261
+ "errors": 14
2262
+ },
2263
+ {
2264
+ "label": "y",
2265
+ "test_support": 40,
2266
+ "training_support": 72,
2267
+ "top1": 0.65,
2268
+ "top5": 0.925,
2269
+ "errors": 14
2270
+ },
2271
+ {
2272
+ "label": "I",
2273
+ "test_support": 40,
2274
+ "training_support": 72,
2275
+ "top1": 0.675,
2276
+ "top5": 0.75,
2277
+ "errors": 13
2278
+ },
2279
+ {
2280
+ "label": "9",
2281
+ "test_support": 40,
2282
+ "training_support": 72,
2283
+ "top1": 0.7,
2284
+ "top5": 0.975,
2285
+ "errors": 12
2286
+ },
2287
+ {
2288
+ "label": "K",
2289
+ "test_support": 40,
2290
+ "training_support": 72,
2291
+ "top1": 0.7,
2292
+ "top5": 0.9,
2293
+ "errors": 12
2294
+ },
2295
+ {
2296
+ "label": "Y",
2297
+ "test_support": 40,
2298
+ "training_support": 72,
2299
+ "top1": 0.7,
2300
+ "top5": 0.875,
2301
+ "errors": 12
2302
+ },
2303
+ {
2304
+ "label": "S",
2305
+ "test_support": 40,
2306
+ "training_support": 72,
2307
+ "top1": 0.725,
2308
+ "top5": 0.925,
2309
+ "errors": 11
2310
+ },
2311
+ {
2312
+ "label": "U",
2313
+ "test_support": 40,
2314
+ "training_support": 72,
2315
+ "top1": 0.725,
2316
+ "top5": 1.0,
2317
+ "errors": 11
2318
+ },
2319
+ {
2320
+ "label": "k",
2321
+ "test_support": 40,
2322
+ "training_support": 72,
2323
+ "top1": 0.725,
2324
+ "top5": 0.975,
2325
+ "errors": 11
2326
+ },
2327
+ {
2328
+ "label": "\"",
2329
+ "test_support": 40,
2330
+ "training_support": 72,
2331
+ "top1": 0.75,
2332
+ "top5": 0.975,
2333
+ "errors": 10
2334
+ },
2335
+ {
2336
+ "label": "u",
2337
+ "test_support": 40,
2338
+ "training_support": 72,
2339
+ "top1": 0.75,
2340
+ "top5": 0.95,
2341
+ "errors": 10
2342
+ },
2343
+ {
2344
+ "label": "1",
2345
+ "test_support": 40,
2346
+ "training_support": 72,
2347
+ "top1": 0.775,
2348
+ "top5": 0.975,
2349
+ "errors": 9
2350
+ },
2351
+ {
2352
+ "label": "J",
2353
+ "test_support": 40,
2354
+ "training_support": 72,
2355
+ "top1": 0.775,
2356
+ "top5": 0.975,
2357
+ "errors": 9
2358
+ },
2359
+ {
2360
+ "label": "M",
2361
+ "test_support": 40,
2362
+ "training_support": 72,
2363
+ "top1": 0.775,
2364
+ "top5": 0.975,
2365
+ "errors": 9
2366
+ },
2367
+ {
2368
+ "label": "X",
2369
+ "test_support": 40,
2370
+ "training_support": 72,
2371
+ "top1": 0.775,
2372
+ "top5": 0.925,
2373
+ "errors": 9
2374
+ },
2375
+ {
2376
+ "label": "4",
2377
+ "test_support": 40,
2378
+ "training_support": 72,
2379
+ "top1": 0.8,
2380
+ "top5": 0.975,
2381
+ "errors": 8
2382
+ },
2383
+ {
2384
+ "label": "A",
2385
+ "test_support": 40,
2386
+ "training_support": 72,
2387
+ "top1": 0.8,
2388
+ "top5": 0.875,
2389
+ "errors": 8
2390
+ },
2391
+ {
2392
+ "label": "L",
2393
+ "test_support": 40,
2394
+ "training_support": 72,
2395
+ "top1": 0.8,
2396
+ "top5": 0.9,
2397
+ "errors": 8
2398
+ },
2399
+ {
2400
+ "label": "N",
2401
+ "test_support": 40,
2402
+ "training_support": 72,
2403
+ "top1": 0.8,
2404
+ "top5": 0.9,
2405
+ "errors": 8
2406
+ },
2407
+ {
2408
+ "label": "t",
2409
+ "test_support": 40,
2410
+ "training_support": 72,
2411
+ "top1": 0.8,
2412
+ "top5": 0.9,
2413
+ "errors": 8
2414
+ },
2415
+ {
2416
+ "label": ";",
2417
+ "test_support": 40,
2418
+ "training_support": 72,
2419
+ "top1": 0.825,
2420
+ "top5": 0.975,
2421
+ "errors": 7
2422
+ },
2423
+ {
2424
+ "label": "H",
2425
+ "test_support": 40,
2426
+ "training_support": 72,
2427
+ "top1": 0.825,
2428
+ "top5": 0.875,
2429
+ "errors": 7
2430
+ },
2431
+ {
2432
+ "label": "T",
2433
+ "test_support": 40,
2434
+ "training_support": 72,
2435
+ "top1": 0.825,
2436
+ "top5": 0.9,
2437
+ "errors": 7
2438
+ }
2439
+ ],
2440
+ "lowest_supported_labels": [
2441
+ {
2442
+ "label": ".",
2443
+ "test_support": 21,
2444
+ "training_support": 44,
2445
+ "top1": 0.047619047619047616,
2446
+ "top5": 0.3333333333333333,
2447
+ "errors": 20
2448
+ },
2449
+ {
2450
+ "label": "!",
2451
+ "test_support": 40,
2452
+ "training_support": 72,
2453
+ "top1": 0.925,
2454
+ "top5": 1.0,
2455
+ "errors": 3
2456
+ },
2457
+ {
2458
+ "label": "\"",
2459
+ "test_support": 40,
2460
+ "training_support": 72,
2461
+ "top1": 0.75,
2462
+ "top5": 0.975,
2463
+ "errors": 10
2464
+ },
2465
+ {
2466
+ "label": "%",
2467
+ "test_support": 40,
2468
+ "training_support": 72,
2469
+ "top1": 1.0,
2470
+ "top5": 1.0,
2471
+ "errors": 0
2472
+ },
2473
+ {
2474
+ "label": "'",
2475
+ "test_support": 40,
2476
+ "training_support": 72,
2477
+ "top1": 0.225,
2478
+ "top5": 0.825,
2479
+ "errors": 31
2480
+ },
2481
+ {
2482
+ "label": "(",
2483
+ "test_support": 40,
2484
+ "training_support": 72,
2485
+ "top1": 0.875,
2486
+ "top5": 1.0,
2487
+ "errors": 5
2488
+ },
2489
+ {
2490
+ "label": ")",
2491
+ "test_support": 40,
2492
+ "training_support": 72,
2493
+ "top1": 0.95,
2494
+ "top5": 1.0,
2495
+ "errors": 2
2496
+ },
2497
+ {
2498
+ "label": ",",
2499
+ "test_support": 40,
2500
+ "training_support": 72,
2501
+ "top1": 0.6,
2502
+ "top5": 0.75,
2503
+ "errors": 16
2504
+ },
2505
+ {
2506
+ "label": "-",
2507
+ "test_support": 40,
2508
+ "training_support": 72,
2509
+ "top1": 0.925,
2510
+ "top5": 1.0,
2511
+ "errors": 3
2512
+ },
2513
+ {
2514
+ "label": "0",
2515
+ "test_support": 40,
2516
+ "training_support": 72,
2517
+ "top1": 0.625,
2518
+ "top5": 0.975,
2519
+ "errors": 15
2520
+ },
2521
+ {
2522
+ "label": "1",
2523
+ "test_support": 40,
2524
+ "training_support": 72,
2525
+ "top1": 0.775,
2526
+ "top5": 0.975,
2527
+ "errors": 9
2528
+ },
2529
+ {
2530
+ "label": "2",
2531
+ "test_support": 40,
2532
+ "training_support": 72,
2533
+ "top1": 0.975,
2534
+ "top5": 1.0,
2535
+ "errors": 1
2536
+ },
2537
+ {
2538
+ "label": "3",
2539
+ "test_support": 40,
2540
+ "training_support": 72,
2541
+ "top1": 1.0,
2542
+ "top5": 1.0,
2543
+ "errors": 0
2544
+ },
2545
+ {
2546
+ "label": "4",
2547
+ "test_support": 40,
2548
+ "training_support": 72,
2549
+ "top1": 0.8,
2550
+ "top5": 0.975,
2551
+ "errors": 8
2552
+ },
2553
+ {
2554
+ "label": "5",
2555
+ "test_support": 40,
2556
+ "training_support": 72,
2557
+ "top1": 0.9,
2558
+ "top5": 0.975,
2559
+ "errors": 4
2560
+ },
2561
+ {
2562
+ "label": "6",
2563
+ "test_support": 40,
2564
+ "training_support": 72,
2565
+ "top1": 0.975,
2566
+ "top5": 1.0,
2567
+ "errors": 1
2568
+ },
2569
+ {
2570
+ "label": "7",
2571
+ "test_support": 40,
2572
+ "training_support": 72,
2573
+ "top1": 0.85,
2574
+ "top5": 0.95,
2575
+ "errors": 6
2576
+ },
2577
+ {
2578
+ "label": "8",
2579
+ "test_support": 40,
2580
+ "training_support": 72,
2581
+ "top1": 0.925,
2582
+ "top5": 1.0,
2583
+ "errors": 3
2584
+ },
2585
+ {
2586
+ "label": "9",
2587
+ "test_support": 40,
2588
+ "training_support": 72,
2589
+ "top1": 0.7,
2590
+ "top5": 0.975,
2591
+ "errors": 12
2592
+ },
2593
+ {
2594
+ "label": ":",
2595
+ "test_support": 40,
2596
+ "training_support": 72,
2597
+ "top1": 0.875,
2598
+ "top5": 1.0,
2599
+ "errors": 5
2600
+ },
2601
+ {
2602
+ "label": ";",
2603
+ "test_support": 40,
2604
+ "training_support": 72,
2605
+ "top1": 0.825,
2606
+ "top5": 0.975,
2607
+ "errors": 7
2608
+ },
2609
+ {
2610
+ "label": "<",
2611
+ "test_support": 40,
2612
+ "training_support": 72,
2613
+ "top1": 1.0,
2614
+ "top5": 1.0,
2615
+ "errors": 0
2616
+ },
2617
+ {
2618
+ "label": ">",
2619
+ "test_support": 40,
2620
+ "training_support": 72,
2621
+ "top1": 0.925,
2622
+ "top5": 1.0,
2623
+ "errors": 3
2624
+ },
2625
+ {
2626
+ "label": "A",
2627
+ "test_support": 40,
2628
+ "training_support": 72,
2629
+ "top1": 0.8,
2630
+ "top5": 0.875,
2631
+ "errors": 8
2632
+ },
2633
+ {
2634
+ "label": "B",
2635
+ "test_support": 40,
2636
+ "training_support": 72,
2637
+ "top1": 0.925,
2638
+ "top5": 1.0,
2639
+ "errors": 3
2640
+ },
2641
+ {
2642
+ "label": "C",
2643
+ "test_support": 40,
2644
+ "training_support": 72,
2645
+ "top1": 0.85,
2646
+ "top5": 1.0,
2647
+ "errors": 6
2648
+ },
2649
+ {
2650
+ "label": "D",
2651
+ "test_support": 40,
2652
+ "training_support": 72,
2653
+ "top1": 0.875,
2654
+ "top5": 1.0,
2655
+ "errors": 5
2656
+ },
2657
+ {
2658
+ "label": "E",
2659
+ "test_support": 40,
2660
+ "training_support": 72,
2661
+ "top1": 0.85,
2662
+ "top5": 0.875,
2663
+ "errors": 6
2664
+ },
2665
+ {
2666
+ "label": "F",
2667
+ "test_support": 40,
2668
+ "training_support": 72,
2669
+ "top1": 0.85,
2670
+ "top5": 0.95,
2671
+ "errors": 6
2672
+ },
2673
+ {
2674
+ "label": "G",
2675
+ "test_support": 40,
2676
+ "training_support": 72,
2677
+ "top1": 0.925,
2678
+ "top5": 0.925,
2679
+ "errors": 3
2680
+ },
2681
+ {
2682
+ "label": "H",
2683
+ "test_support": 40,
2684
+ "training_support": 72,
2685
+ "top1": 0.825,
2686
+ "top5": 0.875,
2687
+ "errors": 7
2688
+ },
2689
+ {
2690
+ "label": "I",
2691
+ "test_support": 40,
2692
+ "training_support": 72,
2693
+ "top1": 0.675,
2694
+ "top5": 0.75,
2695
+ "errors": 13
2696
+ },
2697
+ {
2698
+ "label": "J",
2699
+ "test_support": 40,
2700
+ "training_support": 72,
2701
+ "top1": 0.775,
2702
+ "top5": 0.975,
2703
+ "errors": 9
2704
+ },
2705
+ {
2706
+ "label": "K",
2707
+ "test_support": 40,
2708
+ "training_support": 72,
2709
+ "top1": 0.7,
2710
+ "top5": 0.9,
2711
+ "errors": 12
2712
+ },
2713
+ {
2714
+ "label": "L",
2715
+ "test_support": 40,
2716
+ "training_support": 72,
2717
+ "top1": 0.8,
2718
+ "top5": 0.9,
2719
+ "errors": 8
2720
+ },
2721
+ {
2722
+ "label": "M",
2723
+ "test_support": 40,
2724
+ "training_support": 72,
2725
+ "top1": 0.775,
2726
+ "top5": 0.975,
2727
+ "errors": 9
2728
+ },
2729
+ {
2730
+ "label": "N",
2731
+ "test_support": 40,
2732
+ "training_support": 72,
2733
+ "top1": 0.8,
2734
+ "top5": 0.9,
2735
+ "errors": 8
2736
+ },
2737
+ {
2738
+ "label": "O",
2739
+ "test_support": 40,
2740
+ "training_support": 72,
2741
+ "top1": 0.5,
2742
+ "top5": 0.95,
2743
+ "errors": 20
2744
+ },
2745
+ {
2746
+ "label": "P",
2747
+ "test_support": 40,
2748
+ "training_support": 72,
2749
+ "top1": 0.5,
2750
+ "top5": 0.95,
2751
+ "errors": 20
2752
+ },
2753
+ {
2754
+ "label": "Q",
2755
+ "test_support": 40,
2756
+ "training_support": 72,
2757
+ "top1": 0.95,
2758
+ "top5": 0.95,
2759
+ "errors": 2
2760
+ }
2761
+ ]
2762
+ }
2763
+ },
2764
+ "case_size_proxy": {
2765
+ "scope": "same-writer isolated-glyph relative-size proxy; not continuous-formula product evidence",
2766
+ "writers": 49,
2767
+ "by_source": {
2768
+ "hwrt": {
2769
+ "samples": 84,
2770
+ "raw_correct": 48,
2771
+ "resolved_correct": 33,
2772
+ "changed": 19,
2773
+ "beneficial": 2,
2774
+ "harmful": 17,
2775
+ "raw_top1": 0.5714285714285714,
2776
+ "resolved_top1": 0.39285714285714285,
2777
+ "delta_percentage_points": -17.857142857142858
2778
+ },
2779
+ "uci-uji-pen-v2": {
2780
+ "samples": 640,
2781
+ "raw_correct": 336,
2782
+ "resolved_correct": 298,
2783
+ "changed": 136,
2784
+ "beneficial": 48,
2785
+ "harmful": 86,
2786
+ "raw_top1": 0.525,
2787
+ "resolved_top1": 0.465625,
2788
+ "delta_percentage_points": -5.9375
2789
+ }
2790
+ },
2791
+ "product_validation": false
2792
+ },
2793
+ "checkpoint": "research\\runs\\math_ink_06_federation_clean_seed17_stage3_provenance_baseline_b32_20260725\\math_ink_06_candidate.pt",
2794
+ "device": "cuda",
2795
+ "training_source_ids": [
2796
+ "hwrt",
2797
+ "uci-pendigits",
2798
+ "uci-uji-pen-v2"
2799
+ ],
2800
+ "product_validation": false
2801
+ }
reports/federation_provenance_baseline_seed17_report.json ADDED
@@ -0,0 +1,608 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint": "math_ink_06_candidate.pt",
3
+ "bytes": 8822298,
4
+ "seed": 17,
5
+ "device": "cuda",
6
+ "training_source_ids": [
7
+ "hwrt",
8
+ "uci-pendigits",
9
+ "uci-uji-pen-v2"
10
+ ],
11
+ "training_independent_source_groups": [
12
+ "hwrt-2015",
13
+ "uci-pendigits-81",
14
+ "uji-pen-family"
15
+ ],
16
+ "source_registry_sha256": "fa256b6cfb22b472530f9c8166aff9a1d69a6716ede8e0dc417a29c9b1b11ccc",
17
+ "train_samples": 15829,
18
+ "source_count": 3,
19
+ "training_manifest": {
20
+ "samples": 15829,
21
+ "source_counts": {
22
+ "hwrt": 6000,
23
+ "uci-pendigits": 4457,
24
+ "uci-uji-pen-v2": 5372
25
+ },
26
+ "sample_origin_sha256": "fc103edba331d3682875171b04942a2028232a401a0ca72cd0b1c52da5608c91"
27
+ },
28
+ "baseline_validation": {
29
+ "uci-pendigits": {
30
+ "samples": 300,
31
+ "online_top1": 0.9466666666666667,
32
+ "online_top5": 1.0,
33
+ "raster_top1": 0.37,
34
+ "raster_top5": 0.6566666666666666
35
+ },
36
+ "uci-uji-pen-v2": {
37
+ "samples": 300,
38
+ "online_top1": 0.7666666666666667,
39
+ "online_top5": 0.9666666666666667,
40
+ "raster_top1": 0.43333333333333335,
41
+ "raster_top5": 0.73
42
+ },
43
+ "hwrt": {
44
+ "samples": 261,
45
+ "online_top1": 0.9042145593869731,
46
+ "online_top5": 1.0,
47
+ "raster_top1": 0.789272030651341,
48
+ "raster_top5": 0.9731800766283525
49
+ }
50
+ },
51
+ "selected_validation": {
52
+ "uci-pendigits": {
53
+ "samples": 300,
54
+ "online_top1": 0.9633333333333334,
55
+ "online_top5": 1.0,
56
+ "raster_top1": 0.3333333333333333,
57
+ "raster_top5": 0.6233333333333333
58
+ },
59
+ "uci-uji-pen-v2": {
60
+ "samples": 300,
61
+ "online_top1": 0.83,
62
+ "online_top5": 0.9766666666666667,
63
+ "raster_top1": 0.43333333333333335,
64
+ "raster_top5": 0.7466666666666667
65
+ },
66
+ "hwrt": {
67
+ "samples": 261,
68
+ "online_top1": 0.896551724137931,
69
+ "online_top5": 1.0,
70
+ "raster_top1": 0.7816091954022989,
71
+ "raster_top5": 0.9693486590038314
72
+ }
73
+ },
74
+ "selected_epoch": 3,
75
+ "selected_interpolation_alpha": 1.0,
76
+ "baseline_test": {
77
+ "uci-pendigits": {
78
+ "samples": 500,
79
+ "online_top1": 0.902,
80
+ "online_top5": 0.992,
81
+ "raster_top1": 0.366,
82
+ "raster_top5": 0.646
83
+ },
84
+ "uci-uji-pen-v2": {
85
+ "samples": 500,
86
+ "online_top1": 0.696,
87
+ "online_top5": 0.93,
88
+ "raster_top1": 0.378,
89
+ "raster_top5": 0.698
90
+ },
91
+ "hwrt": {
92
+ "samples": 500,
93
+ "online_top1": 0.832,
94
+ "online_top5": 0.99,
95
+ "raster_top1": 0.756,
96
+ "raster_top5": 0.944
97
+ }
98
+ },
99
+ "test": {
100
+ "uci-pendigits": {
101
+ "samples": 500,
102
+ "online_top1": 0.95,
103
+ "online_top5": 0.994,
104
+ "raster_top1": 0.316,
105
+ "raster_top5": 0.606
106
+ },
107
+ "uci-uji-pen-v2": {
108
+ "samples": 500,
109
+ "online_top1": 0.732,
110
+ "online_top5": 0.946,
111
+ "raster_top1": 0.394,
112
+ "raster_top5": 0.698
113
+ },
114
+ "hwrt": {
115
+ "samples": 500,
116
+ "online_top1": 0.842,
117
+ "online_top5": 0.99,
118
+ "raster_top1": 0.744,
119
+ "raster_top5": 0.946
120
+ }
121
+ },
122
+ "test_delta": {
123
+ "uci-pendigits": {
124
+ "online_top1": 0.04799999999999993,
125
+ "online_top5": 0.0020000000000000018,
126
+ "raster_top1": -0.04999999999999999,
127
+ "raster_top5": -0.040000000000000036
128
+ },
129
+ "uci-uji-pen-v2": {
130
+ "online_top1": 0.03600000000000003,
131
+ "online_top5": 0.015999999999999903,
132
+ "raster_top1": 0.016000000000000014,
133
+ "raster_top5": 0.0
134
+ },
135
+ "hwrt": {
136
+ "online_top1": 0.010000000000000009,
137
+ "online_top5": 0.0,
138
+ "raster_top1": -0.01200000000000001,
139
+ "raster_top5": 0.0020000000000000018
140
+ }
141
+ },
142
+ "history": [
143
+ {
144
+ "epoch": 0,
145
+ "macro_online_top1": 0.8725159642401022,
146
+ "validation": {
147
+ "uci-pendigits": {
148
+ "samples": 300,
149
+ "online_top1": 0.9466666666666667,
150
+ "online_top5": 1.0,
151
+ "raster_top1": 0.37,
152
+ "raster_top5": 0.6566666666666666
153
+ },
154
+ "uci-uji-pen-v2": {
155
+ "samples": 300,
156
+ "online_top1": 0.7666666666666667,
157
+ "online_top5": 0.9666666666666667,
158
+ "raster_top1": 0.43333333333333335,
159
+ "raster_top5": 0.73
160
+ },
161
+ "hwrt": {
162
+ "samples": 261,
163
+ "online_top1": 0.9042145593869731,
164
+ "online_top5": 1.0,
165
+ "raster_top1": 0.789272030651341,
166
+ "raster_top5": 0.9731800766283525
167
+ }
168
+ }
169
+ },
170
+ {
171
+ "epoch": 1,
172
+ "loss": 0.8822918586657453,
173
+ "cross_source_contrastive_anchors": 0,
174
+ "macro_online_top1": 0.8893486590038314,
175
+ "hwrt_gate": false,
176
+ "validation": {
177
+ "uci-pendigits": {
178
+ "samples": 300,
179
+ "online_top1": 0.9566666666666667,
180
+ "online_top5": 1.0,
181
+ "raster_top1": 0.34,
182
+ "raster_top5": 0.6233333333333333
183
+ },
184
+ "uci-uji-pen-v2": {
185
+ "samples": 300,
186
+ "online_top1": 0.8033333333333333,
187
+ "online_top5": 0.9733333333333334,
188
+ "raster_top1": 0.44666666666666666,
189
+ "raster_top5": 0.7466666666666667
190
+ },
191
+ "hwrt": {
192
+ "samples": 261,
193
+ "online_top1": 0.9080459770114943,
194
+ "online_top5": 1.0,
195
+ "raster_top1": 0.7701149425287356,
196
+ "raster_top5": 0.9731800766283525
197
+ }
198
+ },
199
+ "interpolation": [
200
+ {
201
+ "alpha": 0.25,
202
+ "macro_online_top1": 0.8782375478927203,
203
+ "hwrt_gate": true,
204
+ "validation": {
205
+ "uci-pendigits": {
206
+ "samples": 300,
207
+ "online_top1": 0.9533333333333334,
208
+ "online_top5": 1.0,
209
+ "raster_top1": 0.3566666666666667,
210
+ "raster_top5": 0.6466666666666666
211
+ },
212
+ "uci-uji-pen-v2": {
213
+ "samples": 300,
214
+ "online_top1": 0.7733333333333333,
215
+ "online_top5": 0.9666666666666667,
216
+ "raster_top1": 0.43333333333333335,
217
+ "raster_top5": 0.7333333333333333
218
+ },
219
+ "hwrt": {
220
+ "samples": 261,
221
+ "online_top1": 0.9080459770114943,
222
+ "online_top5": 1.0,
223
+ "raster_top1": 0.7816091954022989,
224
+ "raster_top5": 0.9731800766283525
225
+ }
226
+ }
227
+ },
228
+ {
229
+ "alpha": 0.5,
230
+ "macro_online_top1": 0.8815708812260538,
231
+ "hwrt_gate": true,
232
+ "validation": {
233
+ "uci-pendigits": {
234
+ "samples": 300,
235
+ "online_top1": 0.9533333333333334,
236
+ "online_top5": 1.0,
237
+ "raster_top1": 0.35333333333333333,
238
+ "raster_top5": 0.64
239
+ },
240
+ "uci-uji-pen-v2": {
241
+ "samples": 300,
242
+ "online_top1": 0.7833333333333333,
243
+ "online_top5": 0.9733333333333334,
244
+ "raster_top1": 0.44333333333333336,
245
+ "raster_top5": 0.7366666666666667
246
+ },
247
+ "hwrt": {
248
+ "samples": 261,
249
+ "online_top1": 0.9080459770114943,
250
+ "online_top5": 1.0,
251
+ "raster_top1": 0.7816091954022989,
252
+ "raster_top5": 0.9731800766283525
253
+ }
254
+ }
255
+ },
256
+ {
257
+ "alpha": 0.75,
258
+ "macro_online_top1": 0.8882375478927204,
259
+ "hwrt_gate": false,
260
+ "validation": {
261
+ "uci-pendigits": {
262
+ "samples": 300,
263
+ "online_top1": 0.9566666666666667,
264
+ "online_top5": 1.0,
265
+ "raster_top1": 0.3433333333333333,
266
+ "raster_top5": 0.6366666666666667
267
+ },
268
+ "uci-uji-pen-v2": {
269
+ "samples": 300,
270
+ "online_top1": 0.8,
271
+ "online_top5": 0.9733333333333334,
272
+ "raster_top1": 0.44,
273
+ "raster_top5": 0.74
274
+ },
275
+ "hwrt": {
276
+ "samples": 261,
277
+ "online_top1": 0.9080459770114943,
278
+ "online_top5": 1.0,
279
+ "raster_top1": 0.7739463601532567,
280
+ "raster_top5": 0.9731800766283525
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "alpha": 1.0,
286
+ "macro_online_top1": 0.8893486590038314,
287
+ "hwrt_gate": false,
288
+ "validation": {
289
+ "uci-pendigits": {
290
+ "samples": 300,
291
+ "online_top1": 0.9566666666666667,
292
+ "online_top5": 1.0,
293
+ "raster_top1": 0.34,
294
+ "raster_top5": 0.6233333333333333
295
+ },
296
+ "uci-uji-pen-v2": {
297
+ "samples": 300,
298
+ "online_top1": 0.8033333333333333,
299
+ "online_top5": 0.9733333333333334,
300
+ "raster_top1": 0.44666666666666666,
301
+ "raster_top5": 0.7466666666666667
302
+ },
303
+ "hwrt": {
304
+ "samples": 261,
305
+ "online_top1": 0.9080459770114943,
306
+ "online_top5": 1.0,
307
+ "raster_top1": 0.7701149425287356,
308
+ "raster_top5": 0.9731800766283525
309
+ }
310
+ }
311
+ }
312
+ ],
313
+ "resume_state": "federated_online_epoch_001.pt"
314
+ },
315
+ {
316
+ "epoch": 2,
317
+ "loss": 0.8413337085016438,
318
+ "cross_source_contrastive_anchors": 0,
319
+ "macro_online_top1": 0.8945721583652618,
320
+ "hwrt_gate": false,
321
+ "validation": {
322
+ "uci-pendigits": {
323
+ "samples": 300,
324
+ "online_top1": 0.9633333333333334,
325
+ "online_top5": 1.0,
326
+ "raster_top1": 0.34,
327
+ "raster_top5": 0.6266666666666667
328
+ },
329
+ "uci-uji-pen-v2": {
330
+ "samples": 300,
331
+ "online_top1": 0.82,
332
+ "online_top5": 0.9733333333333334,
333
+ "raster_top1": 0.4266666666666667,
334
+ "raster_top5": 0.7533333333333333
335
+ },
336
+ "hwrt": {
337
+ "samples": 261,
338
+ "online_top1": 0.9003831417624522,
339
+ "online_top5": 1.0,
340
+ "raster_top1": 0.7739463601532567,
341
+ "raster_top5": 0.9731800766283525
342
+ }
343
+ },
344
+ "interpolation": [
345
+ {
346
+ "alpha": 0.25,
347
+ "macro_online_top1": 0.8780715197956578,
348
+ "hwrt_gate": true,
349
+ "validation": {
350
+ "uci-pendigits": {
351
+ "samples": 300,
352
+ "online_top1": 0.9533333333333334,
353
+ "online_top5": 1.0,
354
+ "raster_top1": 0.36,
355
+ "raster_top5": 0.65
356
+ },
357
+ "uci-uji-pen-v2": {
358
+ "samples": 300,
359
+ "online_top1": 0.7766666666666666,
360
+ "online_top5": 0.9666666666666667,
361
+ "raster_top1": 0.43666666666666665,
362
+ "raster_top5": 0.73
363
+ },
364
+ "hwrt": {
365
+ "samples": 261,
366
+ "online_top1": 0.9042145593869731,
367
+ "online_top5": 1.0,
368
+ "raster_top1": 0.7854406130268199,
369
+ "raster_top5": 0.9731800766283525
370
+ }
371
+ }
372
+ },
373
+ {
374
+ "alpha": 0.5,
375
+ "macro_online_top1": 0.8847381864623244,
376
+ "hwrt_gate": true,
377
+ "validation": {
378
+ "uci-pendigits": {
379
+ "samples": 300,
380
+ "online_top1": 0.9566666666666667,
381
+ "online_top5": 1.0,
382
+ "raster_top1": 0.35,
383
+ "raster_top5": 0.6466666666666666
384
+ },
385
+ "uci-uji-pen-v2": {
386
+ "samples": 300,
387
+ "online_top1": 0.7933333333333333,
388
+ "online_top5": 0.9733333333333334,
389
+ "raster_top1": 0.44333333333333336,
390
+ "raster_top5": 0.7333333333333333
391
+ },
392
+ "hwrt": {
393
+ "samples": 261,
394
+ "online_top1": 0.9042145593869731,
395
+ "online_top5": 1.0,
396
+ "raster_top1": 0.789272030651341,
397
+ "raster_top5": 0.9731800766283525
398
+ }
399
+ }
400
+ },
401
+ {
402
+ "alpha": 0.75,
403
+ "macro_online_top1": 0.8914048531289911,
404
+ "hwrt_gate": true,
405
+ "validation": {
406
+ "uci-pendigits": {
407
+ "samples": 300,
408
+ "online_top1": 0.9566666666666667,
409
+ "online_top5": 1.0,
410
+ "raster_top1": 0.3433333333333333,
411
+ "raster_top5": 0.6366666666666667
412
+ },
413
+ "uci-uji-pen-v2": {
414
+ "samples": 300,
415
+ "online_top1": 0.8133333333333334,
416
+ "online_top5": 0.9733333333333334,
417
+ "raster_top1": 0.44,
418
+ "raster_top5": 0.7366666666666667
419
+ },
420
+ "hwrt": {
421
+ "samples": 261,
422
+ "online_top1": 0.9042145593869731,
423
+ "online_top5": 1.0,
424
+ "raster_top1": 0.7816091954022989,
425
+ "raster_top5": 0.9731800766283525
426
+ }
427
+ }
428
+ },
429
+ {
430
+ "alpha": 1.0,
431
+ "macro_online_top1": 0.8945721583652618,
432
+ "hwrt_gate": false,
433
+ "validation": {
434
+ "uci-pendigits": {
435
+ "samples": 300,
436
+ "online_top1": 0.9633333333333334,
437
+ "online_top5": 1.0,
438
+ "raster_top1": 0.34,
439
+ "raster_top5": 0.6266666666666667
440
+ },
441
+ "uci-uji-pen-v2": {
442
+ "samples": 300,
443
+ "online_top1": 0.82,
444
+ "online_top5": 0.9733333333333334,
445
+ "raster_top1": 0.4266666666666667,
446
+ "raster_top5": 0.7533333333333333
447
+ },
448
+ "hwrt": {
449
+ "samples": 261,
450
+ "online_top1": 0.9003831417624522,
451
+ "online_top5": 1.0,
452
+ "raster_top1": 0.7739463601532567,
453
+ "raster_top5": 0.9731800766283525
454
+ }
455
+ }
456
+ }
457
+ ],
458
+ "resume_state": "federated_online_epoch_002.pt"
459
+ },
460
+ {
461
+ "epoch": 3,
462
+ "loss": 0.8162824582508339,
463
+ "cross_source_contrastive_anchors": 0,
464
+ "macro_online_top1": 0.8966283524904215,
465
+ "hwrt_gate": true,
466
+ "validation": {
467
+ "uci-pendigits": {
468
+ "samples": 300,
469
+ "online_top1": 0.9633333333333334,
470
+ "online_top5": 1.0,
471
+ "raster_top1": 0.3333333333333333,
472
+ "raster_top5": 0.6233333333333333
473
+ },
474
+ "uci-uji-pen-v2": {
475
+ "samples": 300,
476
+ "online_top1": 0.83,
477
+ "online_top5": 0.9766666666666667,
478
+ "raster_top1": 0.43333333333333335,
479
+ "raster_top5": 0.7466666666666667
480
+ },
481
+ "hwrt": {
482
+ "samples": 261,
483
+ "online_top1": 0.896551724137931,
484
+ "online_top5": 1.0,
485
+ "raster_top1": 0.7816091954022989,
486
+ "raster_top5": 0.9693486590038314
487
+ }
488
+ },
489
+ "interpolation": [
490
+ {
491
+ "alpha": 0.25,
492
+ "macro_online_top1": 0.8804597701149426,
493
+ "hwrt_gate": true,
494
+ "validation": {
495
+ "uci-pendigits": {
496
+ "samples": 300,
497
+ "online_top1": 0.9533333333333334,
498
+ "online_top5": 1.0,
499
+ "raster_top1": 0.36,
500
+ "raster_top5": 0.6466666666666666
501
+ },
502
+ "uci-uji-pen-v2": {
503
+ "samples": 300,
504
+ "online_top1": 0.78,
505
+ "online_top5": 0.9666666666666667,
506
+ "raster_top1": 0.43,
507
+ "raster_top5": 0.7333333333333333
508
+ },
509
+ "hwrt": {
510
+ "samples": 261,
511
+ "online_top1": 0.9080459770114943,
512
+ "online_top5": 1.0,
513
+ "raster_top1": 0.7854406130268199,
514
+ "raster_top5": 0.9731800766283525
515
+ }
516
+ }
517
+ },
518
+ {
519
+ "alpha": 0.5,
520
+ "macro_online_top1": 0.8904597701149425,
521
+ "hwrt_gate": true,
522
+ "validation": {
523
+ "uci-pendigits": {
524
+ "samples": 300,
525
+ "online_top1": 0.96,
526
+ "online_top5": 1.0,
527
+ "raster_top1": 0.3566666666666667,
528
+ "raster_top5": 0.6433333333333333
529
+ },
530
+ "uci-uji-pen-v2": {
531
+ "samples": 300,
532
+ "online_top1": 0.8033333333333333,
533
+ "online_top5": 0.9733333333333334,
534
+ "raster_top1": 0.44333333333333336,
535
+ "raster_top5": 0.73
536
+ },
537
+ "hwrt": {
538
+ "samples": 261,
539
+ "online_top1": 0.9080459770114943,
540
+ "online_top5": 1.0,
541
+ "raster_top1": 0.789272030651341,
542
+ "raster_top5": 0.9731800766283525
543
+ }
544
+ }
545
+ },
546
+ {
547
+ "alpha": 0.75,
548
+ "macro_online_top1": 0.8923499361430395,
549
+ "hwrt_gate": true,
550
+ "validation": {
551
+ "uci-pendigits": {
552
+ "samples": 300,
553
+ "online_top1": 0.96,
554
+ "online_top5": 1.0,
555
+ "raster_top1": 0.3466666666666667,
556
+ "raster_top5": 0.63
557
+ },
558
+ "uci-uji-pen-v2": {
559
+ "samples": 300,
560
+ "online_top1": 0.8166666666666667,
561
+ "online_top5": 0.9733333333333334,
562
+ "raster_top1": 0.44,
563
+ "raster_top5": 0.7466666666666667
564
+ },
565
+ "hwrt": {
566
+ "samples": 261,
567
+ "online_top1": 0.9003831417624522,
568
+ "online_top5": 1.0,
569
+ "raster_top1": 0.7854406130268199,
570
+ "raster_top5": 0.9731800766283525
571
+ }
572
+ }
573
+ },
574
+ {
575
+ "alpha": 1.0,
576
+ "macro_online_top1": 0.8966283524904215,
577
+ "hwrt_gate": true,
578
+ "validation": {
579
+ "uci-pendigits": {
580
+ "samples": 300,
581
+ "online_top1": 0.9633333333333334,
582
+ "online_top5": 1.0,
583
+ "raster_top1": 0.3333333333333333,
584
+ "raster_top5": 0.6233333333333333
585
+ },
586
+ "uci-uji-pen-v2": {
587
+ "samples": 300,
588
+ "online_top1": 0.83,
589
+ "online_top5": 0.9766666666666667,
590
+ "raster_top1": 0.43333333333333335,
591
+ "raster_top5": 0.7466666666666667
592
+ },
593
+ "hwrt": {
594
+ "samples": 261,
595
+ "online_top1": 0.896551724137931,
596
+ "online_top5": 1.0,
597
+ "raster_top1": 0.7816091954022989,
598
+ "raster_top5": 0.9693486590038314
599
+ }
600
+ }
601
+ }
602
+ ],
603
+ "resume_state": "federated_online_epoch_003.pt"
604
+ }
605
+ ],
606
+ "hwrt_official_test_used": false,
607
+ "product_validation": false
608
+ }
scripts/train_math_ink_06_federated_online.py CHANGED
@@ -3,6 +3,7 @@
3
  from __future__ import annotations
4
 
5
  import argparse
 
6
  from hashlib import sha256
7
  import json
8
  import random
@@ -22,7 +23,8 @@ if str(PROJECT_ROOT / "scripts") not in sys.path:
22
  sys.path.insert(0, str(PROJECT_ROOT / "scripts"))
23
 
24
  from math_grid_drawer.research.ink06_federation import (
25
- FederatedPairedInk06Dataset, federation_provenance06, interpolate_state_dict06, load_product_federation06,
 
26
  resolve_training_device06, source_label_balanced_sampler06,
27
  )
28
  from math_grid_drawer.research.math_ink_06 import MathInk06Engine, fuse_hypothesis_class_logits06
@@ -43,6 +45,37 @@ def _source_subset(records: list[dict], maximum: int, seed: int) -> list[dict]:
43
  return _balanced_subset(records, maximum, seed)
44
 
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  def _evaluate_source(
47
  engine: MathInk06Engine, records: list[dict], exact_to_index: dict[str, int],
48
  family_to_index: dict[str, int], batch_size: int,
@@ -88,6 +121,110 @@ def _macro_online(metrics: dict[str, dict[str, float]]) -> float:
88
  return float(np.mean([row["online_top1"] for row in metrics.values()]))
89
 
90
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  def main() -> None:
92
  """필요 변수: base 0.6·승인 source. 작동 원리: 명시적 writer split을 우선한 distillation rehearsal과 holdout 평가를 수행한다."""
93
 
@@ -113,9 +250,29 @@ def main() -> None:
113
  parser.add_argument("--interpolation-alphas", default="0.25,0.5,0.75,1.0")
114
  parser.add_argument("--seed", type=int, default=17)
115
  parser.add_argument("--device", default="auto", help="auto|cpu|cuda[:index]")
 
 
 
 
 
 
 
 
 
 
 
116
  args = parser.parse_args()
117
  if args.raster_supervised_weight < 0 or args.raster_family_supervised_weight < 0:
118
  raise ValueError("raster supervised weight는 0 이상이어야 합니다.")
 
 
 
 
 
 
 
 
 
119
 
120
  random.seed(args.seed)
121
  np.random.seed(args.seed)
@@ -156,7 +313,7 @@ def main() -> None:
156
  train_candidates = [row for row in eligible if _partition(row) >= 2]
157
  validation_candidates = [row for row in eligible if _partition(row) == 0]
158
  training_records.extend(_source_subset(
159
- train_candidates, args.max_train_per_source, args.seed + source_index,
160
  ))
161
  validation_groups[source.source_id] = _source_subset(
162
  validation_candidates, args.max_validation_per_source, args.seed + 20 + source_index,
@@ -167,14 +324,35 @@ def main() -> None:
167
  )
168
  if any(not rows for rows in validation_groups.values()) or any(not rows for rows in test_groups.values()):
169
  raise ValueError("source validation/test partition이 비었습니다.")
170
- sampler = source_label_balanced_sampler06(
171
- training_records, seed=args.seed, samples=len(training_records),
172
- )
173
- loader = DataLoader(
174
- FederatedPairedInk06Dataset(training_records, exact_to_index, family_to_index),
175
- batch_size=args.batch_size, sampler=sampler, num_workers=0,
176
- )
 
 
 
 
 
 
 
 
 
 
177
  optimizer = torch.optim.AdamW(trainable, lr=args.learning_rate, weight_decay=2e-3)
 
 
 
 
 
 
 
 
 
 
 
178
  baseline_validation = _evaluate_sources(
179
  student, validation_groups, exact_to_index, family_to_index, args.batch_size,
180
  )
@@ -192,15 +370,37 @@ def main() -> None:
192
  if not interpolation_alphas or any(not 0.0 < value <= 1.0 for value in interpolation_alphas):
193
  raise ValueError("interpolation alpha는 0보다 크고 1 이하여야 합니다.")
194
  history = [{"epoch": 0, "macro_online_top1": best_macro, "validation": baseline_validation}]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  temperature = 2.0
196
- for epoch in range(1, args.epochs + 1):
197
  student.model.train()
198
- total_loss = seen = 0
199
- for online, raster, _coordinates, _states, exact_target, family_target, _source in loader:
200
  online, raster = online.to(student.device), raster.to(student.device)
201
  exact_target, family_target = exact_target.to(student.device), family_target.to(student.device)
202
  optimizer.zero_grad(set_to_none=True)
203
- exact, family = student.model.forward_online(online)
 
 
 
 
 
 
204
  with torch.inference_mode():
205
  teacher_exact, _teacher_family = teacher.model.forward_online(online)
206
  teacher_raster = teacher.model.forward_raster(raster)["exact_logits"]
@@ -232,6 +432,15 @@ def main() -> None:
232
  student_raster_family_fused, family_target, label_smoothing=0.02,
233
  )
234
  )
 
 
 
 
 
 
 
 
 
235
  loss.backward()
236
  nn.utils.clip_grad_norm_(trainable, 1.0)
237
  optimizer.step()
@@ -257,11 +466,20 @@ def main() -> None:
257
  student.model.load_state_dict(trained_state)
258
  final_row = interpolation[-1]
259
  row = {
260
- "epoch": epoch, "loss": total_loss / max(seen, 1),
261
  "macro_online_top1": final_row["macro_online_top1"], "hwrt_gate": final_row["hwrt_gate"],
262
  "validation": final_row["validation"], "interpolation": interpolation,
263
  }
264
  history.append(row)
 
 
 
 
 
 
 
 
 
265
  print(json.dumps(row, ensure_ascii=False), flush=True)
266
  student.model.load_state_dict(best_state)
267
  final_test = _evaluate_sources(
@@ -280,8 +498,15 @@ def main() -> None:
280
  "raster_distillation_weight": args.raster_distillation_weight,
281
  "raster_supervised_weight": args.raster_supervised_weight,
282
  "raster_family_supervised_weight": args.raster_family_supervised_weight,
 
 
 
 
 
 
 
 
283
  }
284
- args.output.mkdir(parents=True, exist_ok=True)
285
  checkpoint = args.output / "math_ink_06_candidate.pt"
286
  torch.save(output_payload, checkpoint)
287
  report = {
@@ -290,6 +515,7 @@ def main() -> None:
290
  "device": str(student.device),
291
  **provenance,
292
  "train_samples": len(training_records), "source_count": len(sources),
 
293
  "baseline_validation": baseline_validation, "selected_validation": best_metrics,
294
  "selected_epoch": best_epoch, "selected_interpolation_alpha": best_alpha,
295
  "baseline_test": baseline_test, "test": final_test,
 
3
  from __future__ import annotations
4
 
5
  import argparse
6
+ from collections import Counter
7
  from hashlib import sha256
8
  import json
9
  import random
 
23
  sys.path.insert(0, str(PROJECT_ROOT / "scripts"))
24
 
25
  from math_grid_drawer.research.ink06_federation import (
26
+ CrossSourceLabelBatchSampler06, FederatedPairedInk06Dataset, augment_online_features06,
27
+ cross_source_supervised_contrastive_loss06, federation_provenance06, interpolate_state_dict06, load_product_federation06,
28
  resolve_training_device06, source_label_balanced_sampler06,
29
  )
30
  from math_grid_drawer.research.math_ink_06 import MathInk06Engine, fuse_hypothesis_class_logits06
 
45
  return _balanced_subset(records, maximum, seed)
46
 
47
 
48
+ def _parse_source_train_caps06(value: str) -> dict[str, int]:
49
+ """필요 변수: `source_id=count` CSV. 작동 원리: 공통 상한으로 재현할 수 없는 source별 training cap을 명시적으로 검증해 반환한다."""
50
+
51
+ if not value.strip():
52
+ return {}
53
+ output: dict[str, int] = {}
54
+ for item in value.split(","):
55
+ source_id, separator, raw_count = item.strip().partition("=")
56
+ if not separator or not source_id or not raw_count.isdigit() or int(raw_count) <= 0:
57
+ raise ValueError("source train cap은 `source_id=양의정수` CSV여야 합니다.")
58
+ if source_id in output:
59
+ raise ValueError(f"source train cap이 중복되었습니다: {source_id}")
60
+ output[source_id] = int(raw_count)
61
+ return output
62
+
63
+
64
+ def _training_manifest06(records: list[dict]) -> dict[str, object]:
65
+ """필요 변수: 최종 선택된 training record. 작동 원리: source별 실제 수와 source/sample/origin 식별자의 SHA-256을 고정해 동일 count의 다른 표본 재학습을 막는다."""
66
+
67
+ rows = sorted(
68
+ f"{row['source']}\x1f{row['sample_id']}\x1f{row.get('origin_id', '')}"
69
+ for row in records
70
+ )
71
+ digest = sha256("\n".join(rows).encode("utf-8")).hexdigest()
72
+ return {
73
+ "samples": len(records),
74
+ "source_counts": dict(sorted(Counter(str(row["source"]) for row in records).items())),
75
+ "sample_origin_sha256": digest,
76
+ }
77
+
78
+
79
  def _evaluate_source(
80
  engine: MathInk06Engine, records: list[dict], exact_to_index: dict[str, int],
81
  family_to_index: dict[str, int], batch_size: int,
 
121
  return float(np.mean([row["online_top1"] for row in metrics.values()]))
122
 
123
 
124
+ def _file_sha25606(path: Path) -> str:
125
+ """필요 변수: UTF-8과 무관한 checkpoint byte 경로. 작동 원리: resume이 다른 base 모델을 섞지 않도록 SHA-256을 계산한다."""
126
+
127
+ digest = sha256()
128
+ with path.open("rb") as stream:
129
+ for chunk in iter(lambda: stream.read(1024 * 1024), b""):
130
+ digest.update(chunk)
131
+ return digest.hexdigest()
132
+
133
+
134
+ def _resume_contract06(
135
+ checkpoint: Path, *, seed: int, source_ids: list[str], train_samples: int,
136
+ max_train_per_source: int, max_validation_per_source: int, max_test_per_source: int,
137
+ cross_source_pair_fraction: float = 0.0, cross_source_contrastive_weight: float = 0.0,
138
+ cross_source_temperature: float = 0.20, source_train_caps: dict[str, int] | None = None,
139
+ training_sample_origin_sha256: str = "",
140
+ ) -> dict[str, object]:
141
+ """필요 변수: base checkpoint·고정 source split·sampling/loss 설정. 작동 원리: epoch resume이 다른 data 또는 cross-source 정렬 계약을 이어붙이는 일을 fail-closed로 막는다."""
142
+
143
+ return {
144
+ "schema_version": "aiflow-math-ink-0.6-federated-online-resume1",
145
+ "base_checkpoint_sha256": _file_sha25606(checkpoint),
146
+ "seed": seed,
147
+ "source_ids": sorted(source_ids),
148
+ "train_samples": train_samples,
149
+ "max_train_per_source": max_train_per_source,
150
+ "max_validation_per_source": max_validation_per_source,
151
+ "max_test_per_source": max_test_per_source,
152
+ "cross_source_pair_fraction": cross_source_pair_fraction,
153
+ "cross_source_contrastive_weight": cross_source_contrastive_weight,
154
+ "cross_source_temperature": cross_source_temperature,
155
+ "source_train_caps": dict(sorted((source_train_caps or {}).items())),
156
+ "training_sample_origin_sha256": training_sample_origin_sha256,
157
+ }
158
+
159
+
160
+ def _restore_optimizer_device06(optimizer: torch.optim.Optimizer, device: torch.device) -> None:
161
+ """필요 변수: CPU로 저장된 optimizer state·실행 device. 작동 원리: resume 뒤 Adam moment를 parameter와 같은 device로 되돌린다."""
162
+
163
+ for state in optimizer.state.values():
164
+ for key, value in state.items():
165
+ if isinstance(value, torch.Tensor):
166
+ state[key] = value.to(device)
167
+
168
+
169
+ def _save_epoch_state06(
170
+ path: Path, *, contract: dict[str, object], epoch: int, student_state: dict[str, torch.Tensor],
171
+ best_state: dict[str, torch.Tensor], anchor_state: dict[str, torch.Tensor], optimizer: torch.optim.Optimizer,
172
+ best_metrics: dict[str, dict[str, float]], best_macro: float, best_epoch: int, best_alpha: float,
173
+ history: list[dict], sampler: object,
174
+ ) -> None:
175
+ """필요 변수: epoch 모델·선택 state·sampler/RNG. 작동 원리: 다음 실행이 같은 sampler 순서와 augmentation 난수에서 정확히 이어지게 저장한다."""
176
+
177
+ generator = getattr(sampler, "generator", None)
178
+ sampler_state = generator.get_state() if isinstance(generator, torch.Generator) else None
179
+ payload = {
180
+ "schema_version": "aiflow-math-ink-0.6-federated-online-epoch-state1",
181
+ "contract": contract,
182
+ "last_epoch": epoch,
183
+ "student_state": {key: value.detach().cpu().clone() for key, value in student_state.items()},
184
+ "best_state": {key: value.detach().cpu().clone() for key, value in best_state.items()},
185
+ "anchor_state": {key: value.detach().cpu().clone() for key, value in anchor_state.items()},
186
+ "optimizer_state": optimizer.state_dict(),
187
+ "best_metrics": best_metrics,
188
+ "best_macro": best_macro,
189
+ "best_epoch": best_epoch,
190
+ "best_alpha": best_alpha,
191
+ "history": history,
192
+ "sampler_state": sampler_state,
193
+ "python_rng_state": random.getstate(),
194
+ "numpy_rng_state": np.random.get_state(),
195
+ "torch_rng_state": torch.get_rng_state(),
196
+ "cuda_rng_state": torch.cuda.get_rng_state_all() if torch.cuda.is_available() else None,
197
+ }
198
+ path.parent.mkdir(parents=True, exist_ok=True)
199
+ torch.save(payload, path)
200
+
201
+
202
+ def _restore_epoch_state06(
203
+ path: Path, *, contract: dict[str, object], student: MathInk06Engine,
204
+ optimizer: torch.optim.Optimizer, sampler: object,
205
+ ) -> dict:
206
+ """필요 변수: epoch-state·현재 data contract·student/optimizer. 작동 원리: contract 일치 때만 파라미터·optimizer·난수를 원자적으로 복원한다."""
207
+
208
+ payload = torch.load(path, map_location="cpu", weights_only=False)
209
+ if payload.get("schema_version") != "aiflow-math-ink-0.6-federated-online-epoch-state1":
210
+ raise ValueError("지원하지 않는 federated online epoch-state입니다.")
211
+ if payload.get("contract") != contract:
212
+ raise ValueError("resume epoch-state의 checkpoint/source/split 계약이 현재 실행과 다릅니다.")
213
+ student.model.load_state_dict(payload["student_state"])
214
+ optimizer.load_state_dict(payload["optimizer_state"])
215
+ _restore_optimizer_device06(optimizer, student.device)
216
+ generator = getattr(sampler, "generator", None)
217
+ sampler_state = payload.get("sampler_state")
218
+ if isinstance(generator, torch.Generator) and isinstance(sampler_state, torch.Tensor):
219
+ generator.set_state(sampler_state)
220
+ random.setstate(payload["python_rng_state"])
221
+ np.random.set_state(payload["numpy_rng_state"])
222
+ torch.set_rng_state(payload["torch_rng_state"])
223
+ if torch.cuda.is_available() and payload.get("cuda_rng_state") is not None:
224
+ torch.cuda.set_rng_state_all(payload["cuda_rng_state"])
225
+ return payload
226
+
227
+
228
  def main() -> None:
229
  """필요 변수: base 0.6·승인 source. 작동 원리: 명시적 writer split을 우선한 distillation rehearsal과 holdout 평가를 수행한다."""
230
 
 
250
  parser.add_argument("--interpolation-alphas", default="0.25,0.5,0.75,1.0")
251
  parser.add_argument("--seed", type=int, default=17)
252
  parser.add_argument("--device", default="auto", help="auto|cpu|cuda[:index]")
253
+ parser.add_argument("--online-rotation-degrees", type=float, default=0.0)
254
+ parser.add_argument("--online-scale-jitter", type=float, default=0.0)
255
+ parser.add_argument("--cross-source-pair-fraction", type=float, default=0.0)
256
+ parser.add_argument("--cross-source-contrastive-weight", type=float, default=0.0)
257
+ parser.add_argument("--cross-source-temperature", type=float, default=0.20)
258
+ parser.add_argument("--source-train-caps", default="", help="선택 source별 training cap: source_id=count,...")
259
+ parser.add_argument("--resume-state", type=Path, help="이전 epoch-state에서 안전하게 재개한다.")
260
+ parser.add_argument(
261
+ "--save-epoch-state", action=argparse.BooleanOptionalAction, default=True,
262
+ help="각 epoch의 재개 가능한 state를 저장한다.",
263
+ )
264
  args = parser.parse_args()
265
  if args.raster_supervised_weight < 0 or args.raster_family_supervised_weight < 0:
266
  raise ValueError("raster supervised weight는 0 이상이어야 합니다.")
267
+ if args.online_rotation_degrees < 0 or args.online_scale_jitter < 0:
268
+ raise ValueError("online augmentation 범위는 0 이상이어야 합니다.")
269
+ if not 0.0 <= args.cross_source_pair_fraction <= 1.0:
270
+ raise ValueError("cross-source pair 비율은 0과 1 사이여야 합니다.")
271
+ if args.cross_source_contrastive_weight < 0.0 or args.cross_source_temperature <= 0.0:
272
+ raise ValueError("cross-source contrastive weight는 0 이상, temperature는 양수여야 합니다.")
273
+ if args.cross_source_contrastive_weight > 0.0 and args.cross_source_pair_fraction <= 0.0:
274
+ raise ValueError("contrastive loss에는 0보다 큰 cross-source pair 비율이 필요합니다.")
275
+ source_train_caps = _parse_source_train_caps06(args.source_train_caps)
276
 
277
  random.seed(args.seed)
278
  np.random.seed(args.seed)
 
313
  train_candidates = [row for row in eligible if _partition(row) >= 2]
314
  validation_candidates = [row for row in eligible if _partition(row) == 0]
315
  training_records.extend(_source_subset(
316
+ train_candidates, source_train_caps.get(source.source_id, args.max_train_per_source), args.seed + source_index,
317
  ))
318
  validation_groups[source.source_id] = _source_subset(
319
  validation_candidates, args.max_validation_per_source, args.seed + 20 + source_index,
 
324
  )
325
  if any(not rows for rows in validation_groups.values()) or any(not rows for rows in test_groups.values()):
326
  raise ValueError("source validation/test partition이 비었습니다.")
327
+ training_manifest = _training_manifest06(training_records)
328
+ dataset = FederatedPairedInk06Dataset(training_records, exact_to_index, family_to_index)
329
+ if args.cross_source_pair_fraction > 0.0:
330
+ epoch_sampler = CrossSourceLabelBatchSampler06(
331
+ training_records, batch_size=args.batch_size, samples=len(training_records), seed=args.seed,
332
+ pair_fraction=args.cross_source_pair_fraction,
333
+ )
334
+ loader = DataLoader(
335
+ dataset, batch_sampler=epoch_sampler, num_workers=0,
336
+ )
337
+ else:
338
+ sampler = source_label_balanced_sampler06(
339
+ training_records, seed=args.seed, samples=len(training_records),
340
+ )
341
+ epoch_sampler = sampler
342
+ loader = DataLoader(dataset, batch_size=args.batch_size, sampler=sampler, num_workers=0)
343
+ source_to_index = {source_id: index for index, source_id in enumerate(sorted({str(row["source"]) for row in training_records}))}
344
  optimizer = torch.optim.AdamW(trainable, lr=args.learning_rate, weight_decay=2e-3)
345
+ resume_contract = _resume_contract06(
346
+ args.checkpoint, seed=args.seed, source_ids=list(validation_groups), train_samples=len(training_records),
347
+ max_train_per_source=args.max_train_per_source, max_validation_per_source=args.max_validation_per_source,
348
+ max_test_per_source=args.max_test_per_source,
349
+ cross_source_pair_fraction=args.cross_source_pair_fraction,
350
+ cross_source_contrastive_weight=args.cross_source_contrastive_weight,
351
+ cross_source_temperature=args.cross_source_temperature,
352
+ source_train_caps=source_train_caps,
353
+ training_sample_origin_sha256=str(training_manifest["sample_origin_sha256"]),
354
+ )
355
+ args.output.mkdir(parents=True, exist_ok=True)
356
  baseline_validation = _evaluate_sources(
357
  student, validation_groups, exact_to_index, family_to_index, args.batch_size,
358
  )
 
370
  if not interpolation_alphas or any(not 0.0 < value <= 1.0 for value in interpolation_alphas):
371
  raise ValueError("interpolation alpha는 0보다 크고 1 이하여야 합니다.")
372
  history = [{"epoch": 0, "macro_online_top1": best_macro, "validation": baseline_validation}]
373
+ start_epoch = 1
374
+ if args.resume_state is not None:
375
+ resumed = _restore_epoch_state06(
376
+ args.resume_state, contract=resume_contract, student=student, optimizer=optimizer, sampler=epoch_sampler,
377
+ )
378
+ best_state = resumed["best_state"]
379
+ anchor_state = resumed["anchor_state"]
380
+ best_metrics = resumed["best_metrics"]
381
+ best_macro = float(resumed["best_macro"])
382
+ best_epoch = int(resumed["best_epoch"])
383
+ best_alpha = float(resumed["best_alpha"])
384
+ history = list(resumed["history"])
385
+ start_epoch = int(resumed["last_epoch"]) + 1
386
+ if start_epoch > args.epochs:
387
+ raise ValueError("resume epoch-state가 요청 epochs보다 이미 앞서 있습니다.")
388
+ print(json.dumps({"resumed_from": str(args.resume_state), "start_epoch": start_epoch}, ensure_ascii=False), flush=True)
389
  temperature = 2.0
390
+ for epoch in range(start_epoch, args.epochs + 1):
391
  student.model.train()
392
+ total_loss = seen = contrastive_anchors = 0
393
+ for online, raster, _coordinates, _states, exact_target, family_target, source_ids in loader:
394
  online, raster = online.to(student.device), raster.to(student.device)
395
  exact_target, family_target = exact_target.to(student.device), family_target.to(student.device)
396
  optimizer.zero_grad(set_to_none=True)
397
+ augmented_online = augment_online_features06(
398
+ online,
399
+ rotation_degrees=args.online_rotation_degrees,
400
+ scale_jitter=args.online_scale_jitter,
401
+ )
402
+ embedding = student.model.encode_trajectory(augmented_online)
403
+ exact, family = student.model.exact_head(embedding), student.model.family_head(embedding)
404
  with torch.inference_mode():
405
  teacher_exact, _teacher_family = teacher.model.forward_online(online)
406
  teacher_raster = teacher.model.forward_raster(raster)["exact_logits"]
 
432
  student_raster_family_fused, family_target, label_smoothing=0.02,
433
  )
434
  )
435
+ if args.cross_source_contrastive_weight > 0.0:
436
+ source_tensor = torch.tensor(
437
+ [source_to_index[str(value)] for value in source_ids], dtype=torch.long, device=student.device,
438
+ )
439
+ contrastive, anchors = cross_source_supervised_contrastive_loss06(
440
+ embedding, exact_target, source_tensor, temperature=args.cross_source_temperature,
441
+ )
442
+ loss = loss + args.cross_source_contrastive_weight * contrastive
443
+ contrastive_anchors += anchors
444
  loss.backward()
445
  nn.utils.clip_grad_norm_(trainable, 1.0)
446
  optimizer.step()
 
466
  student.model.load_state_dict(trained_state)
467
  final_row = interpolation[-1]
468
  row = {
469
+ "epoch": epoch, "loss": total_loss / max(seen, 1), "cross_source_contrastive_anchors": contrastive_anchors,
470
  "macro_online_top1": final_row["macro_online_top1"], "hwrt_gate": final_row["hwrt_gate"],
471
  "validation": final_row["validation"], "interpolation": interpolation,
472
  }
473
  history.append(row)
474
+ if args.save_epoch_state:
475
+ state_path = args.output / f"federated_online_epoch_{epoch:03d}.pt"
476
+ _save_epoch_state06(
477
+ state_path, contract=resume_contract, epoch=epoch, student_state=trained_state,
478
+ best_state=best_state, anchor_state=anchor_state, optimizer=optimizer,
479
+ best_metrics=best_metrics, best_macro=best_macro, best_epoch=best_epoch,
480
+ best_alpha=best_alpha, history=history, sampler=epoch_sampler,
481
+ )
482
+ row["resume_state"] = state_path.name
483
  print(json.dumps(row, ensure_ascii=False), flush=True)
484
  student.model.load_state_dict(best_state)
485
  final_test = _evaluate_sources(
 
498
  "raster_distillation_weight": args.raster_distillation_weight,
499
  "raster_supervised_weight": args.raster_supervised_weight,
500
  "raster_family_supervised_weight": args.raster_family_supervised_weight,
501
+ "online_rotation_degrees": args.online_rotation_degrees,
502
+ "online_scale_jitter": args.online_scale_jitter,
503
+ "cross_source_pair_fraction": args.cross_source_pair_fraction,
504
+ "cross_source_contrastive_weight": args.cross_source_contrastive_weight,
505
+ "cross_source_temperature": args.cross_source_temperature,
506
+ "source_train_caps": source_train_caps,
507
+ "training_manifest": training_manifest,
508
+ "resumed_from": str(args.resume_state) if args.resume_state is not None else None,
509
  }
 
510
  checkpoint = args.output / "math_ink_06_candidate.pt"
511
  torch.save(output_payload, checkpoint)
512
  report = {
 
515
  "device": str(student.device),
516
  **provenance,
517
  "train_samples": len(training_records), "source_count": len(sources),
518
+ "training_manifest": training_manifest,
519
  "baseline_validation": baseline_validation, "selected_validation": best_metrics,
520
  "selected_epoch": best_epoch, "selected_interpolation_alpha": best_alpha,
521
  "baseline_test": baseline_test, "test": final_test,