ir_model 设计

设计目标

把报告说了什么与它如何绘制分开。Plot IR 是一个小型的、带版本的数据模型,由 report 根据事件生成,任何渲染器(内置的 SVG/HTML、笔记本、仪表盘)都可以使用它。

数学背景

一张图表是点 (x,y,s)(x, y, s) 的有限多重集,其中 xx 是分类值,yy 是实数,ss 是系列标签。渲染器为某个系列绘制的线是映射

x↦yˉs(x)=1∣{ p:p.x=x, p.s=s }∣∑p.x=x, p.s=sp.y,x \mapsto \bar y_{s}(x) = \frac{1}{\lvert\{\,p : p.x = x,\ p.s = s\,\}\rvert} \sum_{p.x = x,\ p.s = s} p.y ,

定义在该系列有点的类别上。由于点被保留,任何其他摘要(中位数、分位数)都可以无损地从同一份 IR 计算出来;而只含摘要的 IR 无法恢复这些点。

设计决策

分类 x 轴

问题。 规模可能是整数、形状、布局或名称。选择。 x 是字符串。理由。 一种表示即可覆盖每种规模类型,首次出现的顺序就是生成者选定的顺序。数值间距则需要在 IR 中引入规模类型。

原始点,而非摘要

点携带原始值;区间图和摘要图只是其点为摘要的图表,由 interval_kind 标注。IR 不必知道是哪个统计量产生了某个数字。

差分证据与图表并列

DifferentialReport 与图表位于同一文档中。渲染器无法在手头没有同一次运行的正确性证据的情况下展示该运行的计时。

每个文档都带版本

schema_version 由 PlotDocument::new 设为 mmks_1 并写入 JSON 形式,因此使用者可以拒绝它们不理解的文档。

正确性与不变量

  • PlotDocument::new 总是把 schema_version 设为 V1。
  • DifferentialReport::empty() 没有任何行,计数均为零。
  • 记录是纯数据:没有验证,没有派生字段。

被否决的方案

  • 带单位的数值坐标轴。 已推迟;见上文。
  • 某个绘图库的规格格式。 会把 IR 绑定到某一个渲染器。

边界

  • 没有渲染(那是 report 的工作)、没有解析、没有统计。
  • 语料总数不会与其他计数进行核对。
  • PlotKind::Pareto 是分类散点图;IR 中没有双坐标轴的前沿。