feat(solve): random_walk 落地;修默认采样器真 bug(integers 不收 float)
random_walk 由用户本人写;Codex 改一处真 bug + 工程侧。 - 真 bug:默认采样器 rng.integers(0, 2, size=size, dtype=float) 被 numpy 拒掉 (Unsupported dtype dtype(float64) for integers),默认路径 100% success=False、 data=None,连 docstring 的 Examples 都跑不通。改成 integers(size=size) * 2 - 1, 由后面的 np.asarray(..., dtype=float) 转 float;实测 (5,101)、步长恒 ±1、同种子可复现 - 工程:ruff W293 x2;docstring 补全(n_steps/n_paths/start/random_state + Returns / Raises / Notes,写清 step_sampler 收二维 size=(n_paths, n_steps)) - tests:random_walk 首次有测试,新增 6 条(形状 + start、步长恒 ±1、可复现、自定义 高斯采样器、3 类非法入参、docstring Example) - monte_carlo_integral:用户第二轮已收 ndarray + 把三行提出 if/else(决策 52) - 验证:205 收集 / 174 passed / 31 skipped / 0 xfail,ruff 0,pyright 0 - docs:STATUS 决策 53 + random_walk 4 条待办;CHANGELOG;易错点 24/25,第 18 条复发 +1
This commit is contained in:
1 parent
dcda080be4
commit
8ec08ea9ce
5 files changed
+254
-32
No files matched your search
@@ -45,6 +45,10 @@
|
||||
| 21 | 公式里的 `^` 不是乘方,而且被 `except` 吞成 success=False | 2026-10-05 |
|
||||
| 22 | 失败结果的 `message` 被包装层无条件覆盖 —— 对外永远报"成功" | 2026-10-05 |
|
||||
| 23 | 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住 | 2026-10-05 |
|
||||
| 24 | 默认参数路径从没被执行过 —— 默认采样器用了库不接受的参数 | 2026-10-05 |
|
||||
| 25 | 两个维度相等时,转置的形状检查会静默通过 | 2026-10-05 |
|
||||
| 22 | 失败结果的 `message` 被包装层无条件覆盖 —— 对外永远报"成功" | 2026-10-05 |
|
||||
| 23 | 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住 | 2026-10-05 |
|
||||
|
||||
---
|
||||
|
||||
@@ -335,7 +339,9 @@
|
||||
(int + np.integer / bool 排在 int 前 / float + np.floating / 数组先 `np.asarray`),
|
||||
再用三个探针各打一枪:`f(x=np.int64(1))`、`f(x=True)`、`f(x=1.0)`。
|
||||
**这一步是本人的活**(决策 49):要不要放宽、报什么错、算不算合法,都是取舍,不是机械活。
|
||||
- 首次:2026-10-04|复发:0
|
||||
- 复发(2026-10-05):`random_walk` 的 `n_steps = 2.5` / `n_steps = True` 又都走 `ValueError("必须是正整数")` ——
|
||||
同模块的 `monte_carlo` 早就是"类型不对 `TypeError`、取值不对 `ValueError`"。表就在那儿,还是没翻。
|
||||
- 首次:2026-10-04|复发:**1(2026-10-05)**
|
||||
|
||||
### 19. 只想着主路径上的那种值,忘了同一位置还会出现别的类型 / 值
|
||||
|
||||
@@ -404,3 +410,28 @@
|
||||
拿到 `mean` 之后先跟解析值比**符号**,再看数值大小。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
### 24. 默认参数路径从没被执行过 —— 默认采样器用了库不接受的参数
|
||||
|
||||
- 现象:`random_walk` 的默认步长采样器写 `rng.integers(0, 2, size=size, dtype=float)`。numpy 的 `Generator.integers`
|
||||
**不收浮点 dtype**(`TypeError: Unsupported dtype dtype('float64') for integers`),于是 `random_walk(100, 5)`
|
||||
这种最普通的调用 100% 返回 `success=False`、`data=None`;连 docstring 里那条 `>>> r.data.shape (5, 101)` 都跑不通。
|
||||
- 为什么会错:写的时候验的是**自定义采样器**那条分支,默认分支(`step_sampler is None`)一次都没执行过;
|
||||
更巧的是 `try/except Exception` 把它压成了一句 message,看起来像"输入不合法"而不是"代码写错了"。
|
||||
与第 21 条同源:**错误现场被 `except` 藏起来**,静态检查(pyright)也看不见。
|
||||
- 以后怎么防:新函数写完,**第一个跑的就是"什么参数都不填的默认调用"**,`success` 必须是 `True`;
|
||||
再把 docstring 的 Examples 真执行一遍(它们是最便宜的一组冒烟测试)。
|
||||
凡是用到"库函数 + 一串可选参数"的地方,别凭记忆写,跑一次看它收不收。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
### 25. 两个维度恰好相等时,转置的形状检查会静默通过
|
||||
|
||||
- 现象:`random_walk` 把 `size=(n_paths, n_steps)` 交给 `step_sampler`,但没校验它返回的形状。
|
||||
实测一个返回**转置**形状 `(n_steps, n_paths)` 的采样器:`n_paths=6, n_steps=4` 时报错(好事),
|
||||
而 `n_paths=n_steps=5` 时 `success=True`、`data` 形状 `(5, 6)` 也"对"—— 里面的路径却是转置过来的,**静默错**。
|
||||
- 为什么会错:形状检查依赖"两个维度不相等"这个前提才生效;`cumsum(axis=1)` + 赋值广播在方阵上完全合法。
|
||||
验算时只挑了一组 `n_paths == n_steps` 的参数,正好落在唯一发现不了的那个点上。
|
||||
与第 23 条同一个思路的不同侧面:**对称/相等会把错误藏起来**。
|
||||
- 以后怎么防:验算参数**把两个维度取成不同值**(`n_paths=3, n_steps=100` 这种),别用正方形;
|
||||
对外部传进来的批量数组显式校验 `shape == (n, d)`,别指望后面的运算替你把关。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
Reference in new issue
Block a user