feat(solve): monte_carlo_integral 落地,修掉体积符号真 bug
实现由用户本人写;Codex 只碰工程侧 + 一处纯 bug(决策 31)。 - 真 bug:体积写成 lows - highs,奇数维为负(1D x^2 于 [0,1] 得 -0.3324、3D 得 -0.5005); 2D 因两个负号相乘"看着对"(+0.2499),把 bug 藏住。改成 widths = highs - lows 后 复测 0.3324 / 0.5005 / 1.9971([0,2])全部正确 - docstring:补 func / n / random_state 与 Raises;写清 metrics["mean"] 才是积分估计值、 data 是 n 个样本各自的贡献(决策 51);修掉跑不通的 Examples(data 是数组,bool(数组) 会抛) - tests/test_solve.py:摘 1 条 skip + 新增 4 条(3D 奇数维 / [0,2] 宽度 / 2D+params / 非法 bounds) - 验证:197 收集 / 166 passed / 31 skipped / 0 xfail,ruff 0,pyright 0 - docs:STATUS 决策 51 + 3 条待办 + 下一站 random_walk;CHANGELOG;易错点 22/23,第 3 条复发 +1
This commit is contained in:
1 parent
b0c4b4a413
commit
ed1f9f0c53
5 files changed
+207
-37
No files matched your search
@@ -43,6 +43,8 @@
|
||||
| 19 | 只想着主路径那种值,忘了布尔 / NaN / 长度不对 | 2026-10-04 |
|
||||
| 20 | "不简单"的信号:同一个信息要在调用方写两遍 | 2026-10-04 |
|
||||
| 21 | 公式里的 `^` 不是乘方,而且被 `except` 吞成 success=False | 2026-10-05 |
|
||||
| 22 | 失败结果的 `message` 被包装层无条件覆盖 —— 对外永远报"成功" | 2026-10-05 |
|
||||
| 23 | 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住 | 2026-10-05 |
|
||||
|
||||
---
|
||||
|
||||
@@ -75,7 +77,10 @@
|
||||
两处打架时合法用法会被 IDE 标红,真正的错误反而看不出来。
|
||||
- 以后怎么防:改签名和改 docstring 必须同一次做完。
|
||||
本项目所有 `random_state` 的注解统一写 `int | np.integer | np.random.Generator | None`。
|
||||
- 首次:2026-10-01|复发:1
|
||||
- 复发(2026-10-05):`monte_carlo_probability` 写 `event: Callable[..., bool]`,docstring 却说"返回长度为 `n` 的**布尔数组**"
|
||||
—— 注解只描述"返回一个 bool"。pyright 实测:这样写会**拒绝**任何注解良好的向量化事件函数(`ndarray` 与 `bool` 不兼容),
|
||||
而运行期它一直都收得下。同一个坑从"收什么"换到了"返回什么":**注解是契约,不是备注**。
|
||||
- 首次:2026-10-01|复发:1 → **2(2026-10-05)**
|
||||
|
||||
### 4. 只覆盖自己的状态,忘了第三方库还在用 numpy 旧全局
|
||||
|
||||
@@ -377,5 +382,25 @@
|
||||
这类"公式抄错"会被直接钉死;④ 记住 `except Exception` 越宽,错误越难看见。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
### 22. 失败结果的 `message` 被包装层无条件覆盖 —— 对外永远报"成功"
|
||||
|
||||
- 现象:`monte_carlo_integral` 里内层 `monte_carlo` 已经返回 `success=False`(`func` 返回了标量),
|
||||
但包装层接着无条件执行 `result.message = "蒙特卡洛多重积分成功:…"`。对外就是 `success=False` + 一句"成功"文案。
|
||||
- 为什么会错:把 `result` 当成"自己的返回值"直接美化,忘了它是**可能失败**的通道。
|
||||
`success` 和 `message` 是同一份状态的两个视图,分开写就一定有机会不一致 —— 与第 12 条(后面的 `if` 静默覆盖前面的)同源。
|
||||
- 以后怎么防:包装函数里只改"成功才会有意义"的字段(`name` / `params` / `metrics`),改 `message` 一律包在
|
||||
`if result.success:` 里;或者只**追加**、不覆盖。写完先跑一次**注定失败**的输入,看对外那两个字段是否自洽。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
### 23. 体积/宽度这种"看着总为正"的量也会减反,维度奇偶还会把符号错误藏住
|
||||
|
||||
- 现象:多重积分里体积写成 `wights = lows - highs`(名字打错 + 减反)。奇数维(1D、3D)估计值全为负、
|
||||
而 **2D 看起来完全正常**(`∫∫ x·y` 得 +0.2499,正确值 0.25)—— 两个负号相乘抵消,把错误藏住了。
|
||||
- 为什么会错:① "上界减下界"被顺手写成了"参数顺序相减",而变量名 `wights` 又不像 `lows` / `highs` 那样自带方向提示;
|
||||
② 验算时只挑了一个二维例子(乘法的对称性恰好掩盖了符号),**维度是奇是偶没进脑子**。
|
||||
同源教训见第 19 条(只想着主路径那种值)。
|
||||
- 以后怎么防:长度/宽度/体积一律写 `high - low`,并在心里念一遍"大的减小的";
|
||||
验算**至少各挑一个奇数维和一个偶数维**(1D + 3D 都能一秒现形);
|
||||
拿到 `mean` 之后先跟解析值比**符号**,再看数值大小。
|
||||
- 首次:2026-10-05|复发:0
|
||||
|
||||
Reference in new issue
Block a user