geopro/docs/superpowers/plans/poc-results-B.md

5.3 KiB
Raw Blame History

POC-B 实测结果gpr_poc headless 度量)

工具:tools/gpr_pocCLI构建产物 build/release/tools/gpr_poc/gpr_poc.exe。 执行机Windows 11MSVCVS18 Community+ NinjaRelease/O2。 日期2026-06-23。

整条地基链路: assembleGprSurvey → buildGprVolume → ChunkedVolumeStore::write → buildPyramid → WholeVolumeSource(load)


1. selftest合成极小数据—— PASS

命令:gpr_poc selftest

  • 构造 2 通道合成 surveysamples=8traces=12写临时 .iprb/.iprh/.ord 走完整 assembleGprSurvey → buildGprVolume → write(brick=4) → buildPyramid(1) → WholeVolumeSource
  • 断言ntraces/samples/channels、channelY 升序、GridSpec 2x2x8、建体维度、 金字塔层数==2、整卷维度一致、(0,0,0) 非 blank。
  • 结果:PASS(退出码 0

结论:除真实 .iprb 读入外,整条地基管线在合成数据上端到端跑通 (装配几何、建体量化、分块压缩落盘、金字塔降采样、整卷重组加载均正确)。


2. 真实数据D:\Downloads\明星路,线 001—— BLOCKED前置 IO 层与真实数据契约不符)

命令:

gpr_poc build "D:\Downloads\明星路" --line 001 --cellXY 0.2 --cellZ 0.05 --out %TEMP%\gpr_store_001 --levels 2

进度:

  • 文件发现 成功:定位 14 通道 明星路_001_A01..A14.iprb + 明星路_001.ord
  • 装配 失败assembleGprSurveyreadIprb文件大小与 samples*traces*2 不符: ..._A01.iprb

根因off-by-onelastTrace+1 vs 真实道数)

readIprb(前置 IO 层,src/io/gpr/IprbReader.cpp:16)硬编码 traces = h.lastTrace + 1 并对文件字节数做严格相等校验。 真实明星路每个通道文件恰好含 lastTrace 条道(少 1 道),逐通道实测:

通道 文件字节 samples LAST TRACE 期望(=samples·(lastTrace+1)·2) 实际道数(=bytes/(samples·2))
A01 74390810 821 45305 74392452 45305
A02 74394094 821 45307 74395736 45307
A03 74390810 821 45305 74392452 45305
A04 74394094 821 45307 74395736 45307
A05 74390810 821 45305 74392452 45305
A06 74394094 821 45307 74395736 45307
A07 74390810 821 45305 74392452 45305
A08 74394094 821 45307 74395736 45307
A09 74390810 821 45305 74392452 45305
A10 74394094 821 45307 74395736 45307
A11 74390810 821 45305 74392452 45305
A12 74392452 821 45306 74394094 45306
A13 74390810 821 45305 74392452 45305
A14 74394094 821 45307 74395736 45307

规律一致:所有通道「实际道数 == LAST TRACE」即真实文件道数 = lastTracereadIprb 期望 lastTrace + 1,每通道恰差 1 道(samples·2 = 1642 字节)。

这是前置 IO 层契约与真实数据约定的系统性不符,不是 gpr_poc CLI 的问题。 现有单测(tests/io/gpr/test_iprb_reader.cpp:30-31)显式锁定 「字节数 != samples·(lastTrace+1)·2 → 抛异常」,故 lastTrace+1 是被测试钉死的契约。

处置(本任务未擅自改前置/测试)

按任务纪律(外科手术式改动、不动他人已测契约、严禁编造指标), 本会话未修改 readIprb 或其单测,故真实数据的建体/维度/压缩比/加载/峰值内存 暂无法实测,如实记录为 BLOCKED。

不是 OOM、不是超时——是装配前的文件读入契约不符调粗 --cellXY 也无法绕过 (在到达建体之前就抛了)。

建议解法(需 POC/IO 层 owner 决策,任一)

  1. 放宽 readIprb:以「文件字节数 / (samples·2)」反推真实道数(容忍 ±N 道), 而非硬用 lastTrace+1;同步更新 test_iprb_reader.cpp。这与真实数据约定 (道数 = lastTrace)一致,最贴近现场。
  2. 明确 LAST TRACE 语义:若约定其为「道数」而非「末道索引」,则 traces = lastTrace (去掉 +1同样需改实现 + 测试。
  3. 任一方案落地后,重跑: gpr_poc build "D:\Downloads\明星路" --line 001 --cellXY 0.2 --cellZ 0.05 --out <store> --levels 2gpr_poc load <store>,本文件 §2 即可补齐真实指标。

3. 预估几何(供解法落地后核对,非实测)

基于真实头samples=821dx≈0.049084 m通道横偏 Y∈[-0.686, 0.686]跨度≈1.372 m 土速 100 m/s、时窗 160.352 ns ⇒ 深度跨度 depthOfSample(820)≈8.0e-6 m(量级极小)。

--cellXY 0.2 --cellZ 0.05、X 跨度≈45305·0.049084≈2223 m

  • nx ≈ ceil(2223/0.2)+1 ≈ 11118
  • ny ≈ ceil(1.372/0.2)+1 ≈ 8
  • nz ≈ ceil(8.0e-6/0.05)+1 = 1Z 物理跨度远小于 cellZ故仅 1 层)

注意:因 SOIL VELOCITY 存为 100 m/s头文件单位 m/µs ×1e6 后),深度尺度为微米级, --cellZ 0.055 cm会把整个深度压成 1 层。落地解法后,若要在 Z 方向有分辨率, 需把 --cellZ 调到与深度跨度匹配的量级(约 1e-8 m或复核土速/时窗单位约定。 此项一并提请 POC owner 确认(影响真实体维度与后续渲染基准 9c