ZZoutian/figure2data-database-v2
figure2data databasev2 — 40K v6 合成科研图表数据集(最终交付版) 生成日期:2026-09-17 生成器:generator 1.6.0 / dataset_generation_revision v6(含两次 hotfix) 规模:40,000 样本(10 图族 / 33 亚型;area、matrix 冻结不生成,set_relation 已删除) 目录结构 databasev2/ ├── figure2data.sqlite3 # 主数据库(2.0 GB:40,000 samples / 280,000 documents) ├── schema/ # sqlite schema ├── shards/ # 数据资产(shard = (样本序号-1)//1000) │ └── shard_000 .. shard_039/ │ ├── images/ # PNG… See the full description on the dataset page: https://huggingface.co/datasets/ZZoutian/figure2data-database-v2.
06.3k
1"""database_yh §14.2 test_renderer_estimation:paired/unpaired/bootstrap 语义(§8)。"""2 3from __future__ import annotations4 5import numpy as np6import pytest7 8 9def test_paired_gt_contract(make_docs, audit):10 """§8.1:GT 必须含 pair_id / condition_a_value / condition_b_value;连线只连同 pair。"""11 docs, rendered = make_docs("statistical", "estimation", variant="paired", seed=3)12 bad = [i for i in audit("t", docs) if i["check"] == "semantic_contract"]13 assert not bad14 truth = docs["truth"]15 paired = next(s for s in truth["series"] if s["data"].get("kind") == "paired")16 pairs = paired["data"]["pairs"]17 assert len(pairs) >= 1018 for pr in pairs:19 assert pr["pair_id"] and "condition_a_value" in pr and "condition_b_value" in pr20 # 连接线 series:x ∈ {0,1}(跨 observation 连线禁止)21 spec_pairs = next(s for s in rendered["spec"]["panels"][0]["series"]22 if (s.get("truth") or {}).get("kind") == "paired")23 xs = np.asarray(spec_pairs["x"], float)24 assert set(np.unique(xs[np.isfinite(xs)])) <= {0.0, 1.0}25 26 27def test_unpaired_no_links_with_ci(make_docs, audit):28 """§8.2:两组原始点 + 组估计 + CI;observation 之间不得连线。"""29 docs, rendered = make_docs("statistical", "estimation", variant="unpaired", seed=5)30 bad = [i for i in audit("t", docs) if i["check"] == "semantic_contract"]31 assert not bad32 truth = docs["truth"]33 est = next(s for s in truth["series"] if s["data"].get("kind") == "estimation")34 d = est["data"]35 assert len(d["estimate"]) == 2 and len(d["ci_low"]) == 2 and len(d["ci_high"]) == 236 for e, lo, hi in zip(d["estimate"], d["ci_low"], d["ci_high"]):37 assert lo < e < hi38 # 无 pair 连接线39 assert not any((s.get("truth") or {}).get("kind") == "paired"40 for s in rendered["spec"]["panels"][0]["series"])41 42 43def test_bootstrap_interval_gt_contract(make_docs, audit):44 """§8.3:estimate/ci_low/ci_high + bootstrap_samples 必须入 GT。"""45 docs, _ = make_docs("statistical", "estimation", variant="bootstrap_interval", seed=9)46 bad = [i for i in audit("t", docs) if i["check"] == "semantic_contract"]47 assert not bad48 truth = docs["truth"]49 est = next(s for s in truth["series"] if s["data"].get("kind") == "estimation")50 d = est["data"]51 assert d["ci_low"] < d["estimate"] < d["ci_high"]52 assert len(d["bootstrap_samples"]) == 50053 # scene measurements 含 estimate_ci54 ms = docs["scene"]["specialized"].get("measurements") or []55 assert any(m.get("kind") == "estimate_ci" for m in ms), "scene 缺 estimate_ci measurement"56 