feat(solve): 审查 markov_simulate:工程侧收口 + 9 条测试

用户实现的第一版 markov_simulate 算法本体经探针实测正确(终点频率 [0.657, 0.343]
对照平稳分布 [2/3, 1/3],同种子可复现),本次只动工程侧,未改任何算法行:

- ruff 8 条全清(I001 导入排序 + 5 处 W293 / 2 处 W291)
- docstring 从一行补全为 Parameters / Returns / Raises / Notes / Examples
- 文案:马尔科夫→马尔可夫(3 处)、initail→initial、半角逗号→全角、paths[:,0]→paths[:, 0]
- arr, kind = as_array(...) 的 kind 全程未用 → arr, _
- tests/test_solve.py 新增 9 条 markov_simulate 测试(此前 0 条)
- STATUS.md 新增决策 56(initial 语义待用户拍板,A/B/C 三选项)与 5 条待办
- CHANGELOG 与 docs/dev/personal-pitfalls.md 易错点 27(入口分流后两条分支口径矛盾)

校验:pytest 188 passed / 31 skipped(219 收集);ruff 0;pyright 0
This commit is contained in:
guzhujushi committed 2026-10-05 23:11:04 +08:00
1 parent 9368dd91cb
commit dd9bd638b8
5 files changed
+323 -23

No files matched your search

+15
View File
@@ -453,3 +453,18 @@
② 每写一个 `try`,必须配一个**注定失败**的用例(`assert r.success is False`),专门喂 `except` 分支;
③ 包装层的失败结果也要带 `params`,出问题才追得回去。
- 首次:2026-10-05|复发:0
### 27. 入口按类型分成两条路,两条路的校验口径互相矛盾
- 现象:`markov_simulate` 的 `initial` 用 `isinstance(initial, int)` 分流。标量那条按**路径数**铺满
(`np.full(n_paths, initial)`),数组那条却按**状态数**校验(`len(initial) != s` 报错),
而真正写进去的是 `paths[:, 0] = current_states`,长度要等于**路径数**。于是"数组 + `n_paths != s`"
这条组合永远跑不通;`n_paths == s` 时又能跑通 —— **同一个入口,两个维度各管一半**。
实测 `initial=[0.5, 0.5], n_paths=5` 直接在 `try` 外抛 `ValueError`(本该 `success=False`)。
- 为什么会错:写校验时是"顺着刚写完的那一行"补的 —— 标量分支当年是为了铺满路径,数组分支是照着"转移矩阵的状态数"
顺手写的,两边各自看着都对。**没有回到参数本身的语义上问一句"它到底是按谁计数"**。
同族:`np.int64(0)` 掉进数组分支(`isinstance` 只写了 `int`,易错点 1)、`True` 被当状态 1 静默放行。
- 以后怎么防:① 一个参数有多条类型分支时,**把每条分支的"计数维度"写在一张纸上**(按路径数?按状态数?按列数?),
对不上就说明口径没定清,**先定语义再写代码**;② 分流用的 `isinstance` 必须把 `np.integer` / `bool` 一起想到(易错点 1);
③ 任何"写进结果数组"的赋值,问一遍"它的长度约束和上面校验用的是同一个下标维度吗"。
- 首次:2026-10-05|复发:0