一维数组如何折叠成 TreeHeap:先保序,再谈取模

SPR-034 修正了一个问题:

internal node 不应该先预测任意 checksum。
它应该先读取 length / first / last / prefix 这种自然属性。

你随后指出一个更关键的点:

residue 的引入有点生硬。

这个判断是对的。

你引入 residue,并不是为了让 SPR-034 证明模运算。 你真正想讨论的是:

一维有序数组折叠成树结构时,
是否可能有模计算、周期、循环地址参与?

这是另一个问题。

所以 SPR-035 做一件更基础的事:

把“一维数组 -> TreeHeap”的第一步说清楚。

我的结论先放前面:

第一步必须保序。
也就是必须保留 leaf address、path、subheap locality。

取模可以研究,
但它应该是后续 folding kernel,
不能替代第一步的保序 TreeHeap fold。

为什么要先保序

假设有一个一维 token 数组:

[a, b, c, d, e, f, g, h]

TreeHeap 把它写到叶子:

              root
          /          \
      [a b c d]    [e f g h]
      /     \       /     \
   [a b]  [c d]  [e f]  [g h]

这个结构的关键不是“看起来像树”。

关键是每个 internal node 对应一个连续子区间:

node 2 -> [a b c d]
node 3 -> [e f g h]
node 4 -> [a b]
node 5 -> [c d]

所以当我们问:

node 5 的 first 是什么?

答案应该是:

c

这依赖的不是语义,而是结构:

一维顺序
+ 叶子地址
+ 树路径
+ 子树覆盖范围

如果第一步就把这些丢了,后面再做 read kernel、semantic decoder、probability collapse 都会很难。

三种折叠方式

这次 toy proof 比较三种 encoder。

1. ordered_tree_fold

这是正常 TreeHeap fold。

token 按原始顺序写入 leaf
internal node 保存自己覆盖的子树摘要

它保留:

地址
路径
左右结构
子树局部性

2. bag_root_fold

这是把整句话压成一个全局 bag/root summary。

[a,b,c,d,e,f,g,h] -> 一个 root summary

它可能知道全局有哪些 token。 但它不知道:

node 5 覆盖的是 [c,d]

所以它无法稳定回答局部子树问题。

3. modulo_fold

这是对你 residue 思路的一个诊断版本。

例如:

position % 4

那么位置会被折叠成周期地址:

0,4,8,... -> bucket 0
1,5,9,... -> bucket 1
2,6,10,... -> bucket 2
3,7,11,... -> bucket 3

这个操作不是错的。 它可能对周期任务、循环结构、某些 folding kernel 有意义。

但如果太早使用,它会把远处位置混在一起。 这会破坏自然子树 readout。

换句话说:

modulo 是一个可能的后续算子,
不是第一步保序 fold 的替代品。

实验问题

我们用纯 toy 数据。 没有训练,没有 GPU,没有语义。

samples = 5000
sequence length = 8..16
max_len = 16
vocab = 257
mod_base = 4

对每个序列,随机生成 token。 然后对 TreeHeap 的 internal node 提问:

length
first
last
prefix0
prefix1

例子:

seq = [172, 68, 175, 79, 147, 222, 130, 32,
       141, 188, 50, 187, 5, 6, 50, 254]

query_node = 6
span = [8, 12]
target = [141, 188, 50, 187]

正确答案:

length  = 4
first   = 141
last    = 187
prefix0 = 141
prefix1 = 188

实验结果

结果如下:

Model Length First Last Prefix0 Prefix1 Mean natural Exact all
ordered_tree_fold 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
bag_root_fold 0.0888 0.3236 0.3236 0.3236 0.3235 0.2766 0.0888
modulo_fold_base4 0.0888 0.4032 0.4034 0.4032 0.4036 0.3405 0.0888

差距:

ordered_tree_fold - bag_root_fold    = +0.7234
ordered_tree_fold - modulo_fold_base4 = +0.6595

这说明:

保序 TreeHeap fold 可以精确读回自然子树属性。
bag/root collapse 不行。
过早 modulo fold 也不行。

这个实验证明了什么

这次 claim 是:

S1-FOLD-C01:
Natural internal readout requires an order-preserving TreeHeap fold.
Leaf address/path structure must be preserved before any bag or modulo/cyclic folding is used.

状态:

supported pilot

它证明的是一个演绎层面的结构事实:

如果目标是自然子树 readout,
那么第一步 fold 必须保留一维顺序和树路径。

这不是深度学习结论。 它更像数学地基。

类似:

如果你要从 321 里读百位、十位、个位,
你必须先保留位权结构。

TreeHeap 也是一样:

如果你要读子树 first/last/prefix,
你必须先保留 leaf address/path/subheap。

这没有证明什么

它没有证明翻译。

它没有证明语义。

它没有证明 learned routing。

它没有证明 TreeHeap 胜过 Transformer。

它也没有证明 modulo 没用。

尤其最后一点很重要:

modulo 没有被否定。

这次只说明:

modulo 不应该替代第一步保序 fold。

如果后续任务本身具有周期结构,比如:

循环地址
周期 pattern
ring buffer
某种 tree convolution 的 cyclic scan

那 modulo kernel 仍然可能有价值。

但那应该是另一个实验。

对 TreeHeap 路线的影响

现在 S1 的顺序更清楚了。

应该是:

Step 1: ordered write
        一维 token 顺序写入 TreeHeap leaf

Step 2: ordered fold kernel
        internal node 保留自然子树属性

Step 3: probabilistic read kernel
        stop / left / right 走到目标节点

Step 4: natural readout
        length / first / last / prefix

Step 5: semantic decoder
        在自然结构 readout 上学习语义

Step 6: optional folding operators
        modulo / cyclic / mirror / conjugate / compression

这比之前更干净。

之前我们把 residue 混在 SPR-034 里,会让 claim 变得不好理解。

现在拆开后,逻辑是:

保序 fold 是地基。
modulo fold 是候选算子。

下一步

我建议 SPR-036 做两条中的一条。

第一条,更贴近 S1:

把 SPR-032 的 probabilistic route
接到 SPR-034/035 的 natural readout。

也就是端到端:

arr[1]
-> stop/left/right collapse
-> target internal node
-> length/first/last/prefix

第二条,更贴近你的数学问题:

专门设计 modulo/cyclic folding 任务。

但这个任务的目标不能再是普通子树 first/last。 它应该是一个真正周期性的目标。

比如:

给定一个周期 kernel,
在 TreeHeap 地址空间里寻找同余类 pattern。

这样 residue 才是自然的。

总结

SPR-035 的一句话结论是:

一维数组折叠成 TreeHeap 时,第一步必须保序。

保序意味着:

leaf address
path
left/right
subheap locality

实验支持这个判断。

ordered_tree_fold mean = 1.0000
bag_root_fold mean     = 0.2766
modulo_fold mean       = 0.3405

所以我们不再把 residue 强塞进 SPR-034。 它应该进入另一条更专业的线:

cyclic / modulo folding kernel

今晚的推进是把地基重新摆正:

先保序,再折叠;
先自然 readout,再语义 decoder;
先结构清楚,再研究 modulo。