Files
stgsharp/future/NGRA_Transformation_Plan.md
T

917 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NGRA 转型计划
> 面向本地 Codex / 项目维护者的快速架构说明
> 项目:Nitload General Regular Analyzer(NGRA)
## 1. 转型结论
NGRA 不再以“高性能字符串正则表达式引擎”为主要目标。
原先围绕 `Span<char>`、专用字符串匹配、复杂回溯、Source Generator 等方向继续投入的收益已经明显下降。后续核心工作转向:
1. 以 **ε-NFA / NFA** 为基础执行模型;
2. 将输入从 `char` 推广为任意可比较、可判定类别的序列元素;
3. 面向 Token Stream、语法前端、半上下文模式分析等场景;
4. 支持自动机归并、分层自动机、状态/断言/前序引用;
5. 在此基础上继续研究 **Weighted Automaton / NGRA-Tensor**。
因此,Text Regex 从“主架构”降级为“兼容前端 / 参考实现 / 测试子系统”。
---
## 2. 当前代码处理原则
### 2.1 保留现有 Text Regex 半成品
当前 Text Regex Source Generator、COUNT/CONCAT/ALT lowering、生成式 matcher 等代码不删除。
原因:
- 五角星 AST 模型仍然是有效成果;
- AST 搜索、规范化、旋转、合并等代码仍可复用;
- 当前实现记录了 COUNT continuation、group boundary、rollback 等真实工程问题;
- 可作为未来自动机 IR 与旧实现行为的对照;
- 删除会丢失大量探索成果。
建议:
- 将旧生成器移动到 `Legacy` / `Experimental` / `Archive` 目录;
- 通过 `.csproj` 的 `Compile Remove` 或独立非构建项目,使其暂时不参与主编译;
- 不再优先修补完整 `.NET Regex` 兼容性。
### 2.2 五角星 AST 继续保留
现有节点关系:
```text
Parent
↑
Previous ← Node → Next
↙ ↘
Left Right
```
继续作为通用语法树 / 结构树基础设施。
需要坚持:
- AST 用于表达语法和结构;
- 自动机 / CFG / Relation Graph 用于表达执行与传播;
- 不再要求 AST 本身承担全部 backtracking / continuation 语义。
---
## 3. 新主线:ε-NFA
第一阶段优先实现一个简单、正确、无性能野心的 ε-NFA 模拟器。
### 3.1 基础状态模型
```text
Current Active States
↓
ε-closure
↓
consume(input)
↓
Next Active States
↓
ε-closure
```
核心状态:
```text
State
Transition
StartState
AcceptStates
ActiveStateSet
```
Transition 分为:
```text
ε transition
matched transition
```
输入类型不能写死为 `char`。
建议:
```csharp
EpsilonNfa<TInput>
```
或:
```csharp
EpsilonNfa<TScalar>
```
匹配条件可以抽象为:
```csharp
bool Match(in TInput input)
```
或者后续升级为更明确的 Predicate / Category Matcher。
### 3.2 第一阶段支持的 Pattern
第一版只要求:
```text
literal / predicate
concat
alternation
*
+
?
{m,n}
ordinary grouping
```
暂不追求:
```text
capture rollback
复杂 greedy / lazy 行为
lookaround
backreference
完整 .NET Regex compatibility
```
其中 `{m,n}` 可以优先在构造期展开为 NFA 结构,而不是运行时维护复杂 COUNT 控制流。
---
## 4. 为什么以 NFA 为主,而不是 DFA
DFA 仍然有价值,但不再是必须经过的阶段。
核心路线:
```text
Pattern
↓
ε-NFA
↓
NFA execution
↓
Weighted NFA
↓
NGRA-Tensor
```
DFA 只作为可选 specialization:
```text
Boolean
Static
No dynamic relation
No weighted state
```
满足这些条件的局部子图,可以由编译器确定化为 DFA fast path。
总体原则:
> NFA 是主语义模型,DFA 是可选优化后端。
原因:
普通 NFA 的活动状态:
```text
a_i ∈ {0,1}
```
加权机可自然推广为:
```text
a_i ∈ R
```
Tensor 版本可以继续推广为:
```text
a_i ∈ R^d
```
多状态同时活跃不再是需要“消除的非确定性”,而会成为模型本身的状态表示。
---
## 5. NGRA 的目标:广义序列分析
NGRA 不再局限于字符串。
典型输入:
```text
char
token
syntax node
semantic node
sensor frame
event
instruction-like object
```
Pattern 的作用也从:
```text
“这个字符串是不是符合 regex”
```
扩展为:
```text
“这个序列在当前状态、历史、类别和上下文条件下,
是否满足某个结构化模式”
```
---
## 6. 半上下文 Token Analyzer
NGRA 的近期目标之一,是成为一种介于普通 Regex 与完整 Parser 之间的 Token Stream Analyzer。
可用能力包括:
```text
Token 类别匹配
Token 属性匹配
前序状态引用
局部断言
Pattern 状态
符号绑定
分层子自动机
局部上下文
```
因此它适合作为:
```text
Lexer 后端
Token Regex
语法前端
编译器预分析器
DSL Parser Frontend
结构化流分析器
```
“半上下文”的含义不是严格的形式语言分类,而是:
> Pattern 不只依赖当前 token,也可以依赖有限的已知状态、绑定、前序结果和结构信息,但不要求一开始就构造完整通用 Parser。
---
## 7. 自动机归并
大量 Pattern 应优先在 NFA 层归并,而不是各自独立执行。
例如:
```text
ε → Pattern A
/
GlobalStart ─ε → Pattern B
\
ε → Pattern C
```
Accepting State 可以附带:
```text
PatternId
MatchKind
Payload
```
后续目标:
- 合并公共路径;
- 消除冗余 ε 边;
- 状态压缩;
- bitset active state;
- pattern priority;
- 多层自动机组合。
---
## 8. 分层自动机
后续重点不是继续增加字符串 Regex 特性,而是建立分层自动机。
示意:
```text
Scalar / Token Layer
↓
Local Pattern Layer
↓
Phrase / Region Layer
↓
Sentence / Structure Layer
↓
Semantic / Relation Layer
```
低层自动机可以生成高层节点,高层节点继续作为新序列输入。
即:
```text
Input Stream
↓
Automaton L0
↓
Derived Nodes
↓
Automaton L1
↓
Higher-level Nodes
```
这应成为 NGRA 进入编译器前端、自然语言结构分析和复杂流分析的主路径。
---
## 9. Assertion / Context 的重新定义
不再围绕字符串 Regex 的 lookahead / lookbehind 设计核心架构。
通用定义应更接近:
```text
Assert(Context) -> bool
```
或者:
```text
RelationGate(State, Context, History) -> bool
```
因此:
- 字符串前瞻/后顾只是特殊情况;
- 前序引用只是状态引用的一种;
- group/capture 不是核心抽象;
- Context / Binding / Region / History 才是可推广概念。
---
# NGRA-Tensor 构想
## 10. 基本方向
NGRA-Tensor 不是简单地“给 NFA 边加 float”。
它希望把:
```text
Boolean multi-state automaton
```
推广为:
```text
Weighted / Tensor Relation Network
```
基础演化:
```text
NFA
a_i ∈ {0,1}
↓ weighted
Weighted Automaton
a_i ∈ R
↓ tensor/state
NGRA-Tensor
a_i ∈ R^d
```
---
## 11. Relation 成为一等对象
不再采用固定 `Port4` 作为核心语义。
推荐模型:
```text
Source Node
↓
[ Relation ]
↓
Destination Node
```
Relation 包含:
```text
Source
Destination
Type
Parameters
Weight / Weight Function
Optional State
Eligibility / Gate
```
语义上:
```text
Relation:
决定一条联系是否生效,
以及它如何把 Source 信息贡献给 Destination。
```
Node 负责保存状态。
Blend 负责汇合多条 Relation 的贡献。
---
## 12. Pull,而不是主动广播
GPU / 执行层优先采用 destination pull:
```text
Destination Node
↓
请求自己依赖的 Relations
↓
读取 Source states
↓
Relation Eval
↓
Blend
```
而不是:
```text
Source Node
↓
主动向大量 Destination 广播
```
优点:
- 减少 scatter;
- 减少原子写冲突;
- 减少 readiness 管理;
- 更适合 GPU destination-centric execution。
---
## 13. Relation 的三段语义
推荐拆成:
```text
Eligibility
↓
Compatibility
↓
Transfer
```
即:
1. **Eligibility**:这条 Relation 当前能不能参与;
2. **Compatibility**:参与后有多重要;
3. **Transfer**:真正传递什么信息。
形式上:
```text
gate_ij = G(state, context, relation)
score_ij = F(query, key, relation)
value_ij = T(source_state, relation)
```
最终:
```text
output_i = Blend(gate_ij * weight_ij * value_ij)
```
---
## 14. 与 Attention / QKV 的关系
QKV 可以作为 Relation 内部算子的第一种 baseline,但不应决定 NGRA-Tensor 的外层拓扑。
标准 Attention:
```text
Q = “我需要什么”
K = “我适不适合被引用”
V = “真正传递的内容”
```
数学上:
```text
score_ij = q_i · k_j
weight_ij = softmax(score_ij)
output_i = Σ weight_ij * v_j
```
NGRA-Tensor 的差异:
- Relation 是显式、长期存在、可带类型的;
- 候选关系通常是稀疏的;
- 不一定对全部 node 做 dense attention;
- Relation 可以有自己的参数、状态、类型和 gate;
- Attention 可以只是某种 Relation Eval backend。
---
## 15. 稀疏关系,而不是全连接爆破
Transformer 的典型关系空间:
```text
L × L
```
NGRA-Tensor 的目标:
```text
E << N²
```
即只计算显式 Relation。
但必须承认:
- 稀疏图带来 gather;
- 不规则访问会伤害 GPU;
- 小算子过多会降低吞吐。
因此不能简单逐 Relation 启动 kernel。
---
## 16. Relation Tile / 脑区式分块
后续 GPU backend 应研究:
```text
Semantic Relation Graph
↓
Graph Partition
↓
Relation Tiles
↓
Block-sparse / Dense subgraph execution
```
目标:
> 块内允许不规则访问,块间尽量转成规则张量传输。
示意:
```text
Dense / semi-dense local region
↓
少量跨区 Relation
↓
another dense / semi-dense region
```
类似“脑区”:
- 区内关系较密;
- 区间关系较稀;
- 每个区可以编译成中型 tensor operator;
- 跨区使用显式 Relation。
这可能成为 NGRA-Tensor 与传统 Transformer 之间的重要折中。
---
## 17. 语义稀疏 vs 物理稠密
前端语义可以是:
```text
Sparse Relation Graph
```
GPU backend 可以通过:
```text
node reorder
feature reorder
relation reorder
graph clustering
block detection
tile packing
kernel fusion
shared-memory staging
```
将其转为:
```text
Dense blocks
+
Block-sparse blocks
+
Irregular sparse tails
```
原则:
> 模型的图结构不等于 GPU 必须逐边解释。
---
## 18. Node State 可以是高维 Tensor
NGRA-Tensor 不等于“每个 Node 只有一个 scalar”。
Node 可以持有:
```text
x_i = [f0, f1, ..., fN]
```
但 Relation 不一定读取全部 feature。
因此可能存在两层稀疏:
```text
Topology sparsity
Feature sparsity
```
Relation 可以只对特定 feature/subspace 感兴趣。
例如:
```text
Relation A:
Q features = [1, 2, 7]
K features = [4, 8]
V features = [16, 17, 18]
```
语义上只取这些 feature。
物理执行时 GPU compiler 可以为了带宽一次读入更大的连续 block。
---
## 19. Tensor 观念
后续 NGRA-Tensor 设计不要把 Tensor 只理解为“算子”。
Tensor 可以同时是:
```text
状态
参数
关系
mask
中间结果
数据集合
算子
```
“算子”只是某个 Tensor 在某次 contraction 中扮演的角色。
建议以“语义轴”理解 Tensor,例如:
```text
Node × Feature
Destination × Source
Relation × Feature
Time × Node × Feature
```
优先思考:
- 哪些轴保留;
- 哪些轴被收缩;
- 哪些轴表示关系;
- 哪些轴表示 feature;
- 哪些轴可以 sparse;
- 哪些轴可以 dense。
---
## 20. 训练 / 运行时关系发现
NGRA-Tensor 长期设想允许结构学习。
训练阶段:
```text
短程强关系
↓
词 / Token 局部关系
↓
词组 / 短句
↓
长句 / 语义
↓
知识网络 / 长程弱关系
```
运行时:
当现有网络:
```text
NoActivePath
LowConfidence
HighAmbiguity
Unknown
```
可进入较慢的 Relation Discovery:
```text
Stable Graph
↓
Unknown
↓
Candidate Relation Search
↓
Candidate Graph
↓
验证
↓
可能固化进入 Stable Graph
```
不建议运行时每一步都修改主图。
应区分:
```text
Fast inference time
Slow structural learning time
```
---
# 近期开发优先级
## Phase 1 — ε-NFA Reference Runtime
实现:
```text
EpsilonNfa<TInput>
StateId
Transition
ε-closure
Consume
Accept
```
目标:
- 语义简单;
- 正确性优先;
- 不做复杂性能优化;
- 不绑定 `char`。
## Phase 2 — Pattern → NFA Lowering
从现有 AST / Pattern IR 构造 NFA:
```text
literal
predicate
concat
alt
repeat
```
## Phase 3 — NFA Merge
实现:
```text
multi-pattern merge
PatternId
shared start
accept payload
```
然后测试大量 Pattern 同时运行。
## Phase 4 — Token Stream
将输入切换到:
```text
Token
```
支持:
```text
Token kind
Token value
Token metadata
simple binding
context predicate
```
目标:作为编译器前端 / Token Regex 原型。
## Phase 5 — Hierarchical Automata
允许低层自动机输出高层节点,并再次进入更高层自动机。
## Phase 6 — Weighted Automaton
将:
```text
active : bool
```
推广为:
```text
activation : float
```
先不要急于引入复杂 Tensor。
## Phase 7 — NGRA-Tensor Prototype
研究:
```text
Node state tensor
Typed Relation
Eligibility
Compatibility
Transfer
Blend
Sparse / block-sparse execution
```
QKV/Attention 可作为 baseline Relation operator。
---
# 非目标
近期不要优先投入:
```text
完整 .NET Regex 兼容
极端 Span<char> 优化
复杂 Source Generator matcher
完整 capture rollback
所有 lookaround/backreference
为了 Regex 完整性设计核心 IR
```
这些功能如确实需要,可以:
```text
System.Text.RegularExpressions
```
作为字符串兼容层。
这不是架构退让,而是目标调整。
---
# 一句话定位
NGRA 的新定位:
> **以 NFA 为基础的广义序列模式与分层自动机框架,并逐步推广到加权 Relation Network 与 NGRA-Tensor。**
Text Regex:
> 一个兼容前端 / 参考实现,不再定义 NGRA 的核心架构。
NGRA-Tensor:
> 把 Boolean NFA 的多状态传播推广为显式、稀疏、可加权、可训练、可分块执行的 Relation Network。