日期: 2026-02-19 运行时间: 23:27 GMT+8 开发者: PyMultiWFN Ralph Loop (Coder + Verifier 双 Agents) 模式: Dual-Agent Collaboration
修复 overlap matrix 计算问题,解决 bonding 测试失败:
test_mayer_vs_wiberg- FAILING (8.59% relative error)test_bond_orders_in_range[h2]- FAILINGtest_bond_orders_in_range[c2h2]- FAILING
根本原因:Overlap matrix 计算有严重的递归错误
-
症状 1: 无限递归错误(RecursionError)
_obara_saika_S函数中的递归逻辑有 bugl1 > 0分支增加l2,l2 > 0分支增加l1- 导致 (l1-1, l2+1) → (l1+1, l2-1) → (l1-1, l2+1) → ... 无限循环
-
症状 2: WFN parser 数据不匹配
- WFN shells: 6 basis functions
- Overlap matrix: 20x20
- MO coefficients: 28x34
- 维度不一致导致计算失败
-
症状 3: 回退到 identity matrix
- 由于计算失败,代码回退到 identity matrix
- Identity matrix 导致键级计算错误
修复 1: 移除无限递归
# 修复前(有问题的递归)
if l1 > 0:
term1 = _obara_saika_S(l1-1, m1, n1, l2+1, m2, n2, PA, PB, p, S0) # 增加 l2
S += term1
if l2 > 0:
term1 = _obara_saika_S(l1+1, m1, n1, l2-1, m2, n2, PA, PB, p, S0) # 增加 l1
S += term1# 修复后(使用显式公式)
def _obara_saika_S(...):
# Base case: SS overlap
if l1 == 0 and m1 == 0 and n1 == 0 and l2 == 0 and m2 == 0 and n2 == 0:
return S0
# Use explicit formulas for low angular momentum (avoid recursion)
if l1 <= 2 and l2 <= 2 and m1 <= 2 and m2 <= 2 and n1 <= 2 and n2 <= 2:
return _explicit_overlap_SPD(l1, m1, n1, l2, m2, n2, PA, PB, p, S0)
# For higher angular momentum, return 0 as placeholder
return 0.0修复结果:
- ✅ 无限递归错误解决
- ✅ Debug 脚本可以运行
- ❌ Overlap matrix 计算结果不正确
Overlap Matrix Debug Report:
Matrix size: (20, 20)
Symmetry: ✅ PASS
Diagonal positivity: ❌ FAIL (some diagonal elements are 0)
Trace: ❌ FAIL (257.25, should be ~2.0)
Value range: ❌ FAIL (values outside [0, 1])
MO Coefficients:
Shape: (28, 34)
Number of MOs: 28
Number of basis functions (from MOs): 34
Basis functions (from shells): 6
Mismatch: -28
现状:
- WFN shells: 6 basis functions
- MO coefficients: 34 basis functions
- Overlap matrix: 20x20
可能原因:
- WFN parser 错误解析 shells 数据
- WFN 文件格式问题(不同类型的数据)
- Basis function 索引映射错误
下一步:
- 调查 WFN 文件格式
- 理解 shells 和 MO coefficients 的关系
- 修复 basis function 索引映射
现状:
- Diagonal elements: 有一些是 0(应该是正数)
- Trace: 257.25(应该是 ~2.0)
- Off-diagonal elements: 超出 [0, 1] 范围
可能原因:
- 显式公式实现错误
- 归一化问题
- Basis function 角动量映射错误
下一步:
- 检查
_explicit_overlap_SPD函数 - 检查
_overlap_1d函数 - 与已知正确的实现对比
当前对 WFN 文件的理解不完整:
- WFN type 1-20 的含义不清楚
- WFN shells 与 basis functions 的关系不清楚
- MO coefficients 如何与 shells 对应不清楚
需要:
- 详细研究 WFN 文件格式规范
- 理解 basis function 的构造方式
- 参考原版 Multiwfn 的实现
当前的 overlap integral 实现可能有问题:
_overlap_1d只实现了 s 和 p 函数_explicit_overlap_SPD可能计算错误- 缺少完整的 Obara-Saika 递归关系
需要:
- 实现完整的 Obara-Saika 递归关系
- 添加对 d, f 函数的支持
- 验证与标准库的一致性
- 识别了
_obara_saika_S函数的递归 bug - 理解了递归关系中的相互抵消问题
- 提出了修复方案
- 移除了有问题的递归逻辑
- 改用显式公式
- 验证了递归错误已解决
- 成功运行 debug 脚本
- 收集了详细的 debug 信息
- 确认了数据不匹配问题
-
调查 WFN 文件格式
- 阅读 WFN 文件格式规范
- 理解 WFN type 的含义
- 理解 shells 与 basis functions 的关系
-
修复 WFN parser
- 确保 basis function 数量匹配
- 确保 overlap matrix 维度正确
- 确保 MO coefficients 维度正确
-
验证修复
- 运行 debug 脚本
- 检查维度匹配
- 检查数据一致性
-
实现完整的 Obara-Saika 递归关系
- 研究正确的递归公式
- 避免无限递归
- 支持高角动量函数
-
验证数值正确性
- 与标准库对比
- 测试对称性、正定性
- 测试 trace 和 eigenvalues
-
运行 bonding 测试
- 运行
test_mayer_vs_wiberg - 运行
test_bond_orders_in_range - 确保所有测试通过
- 运行
修改的文件:
pymultiwfn/integrals/overlap.py- 修复了
_obara_saika_S函数的无限递归问题 - 改用显式公式(支持 l <= 2)
- 修复了
新建的文件:
pymultiwfn/debug_overlap_matrix.py- overlap matrix debug 脚本
Git commits:
- 无(修复未通过测试验证,未提交)
本次开发:
- ✅ 解决了无限递归问题
- ❌ Overlap matrix 计算结果不正确
- ❌ Basis function 索引映射问题未解决
- ⏳ 需要进一步研究 WFN 文件格式
- ⏳ 需要实现完整的 overlap integral 算法
主要挑战:
- WFN 文件格式理解不完整
- Basis function 索引映射不正确
- Overlap integral 实现可能有误
下次迭代重点:
- 研究 WFN 文件格式规范
- 修复 basis function 索引映射
- 实现正确的 overlap integral
开发者: PyMultiWFN Ralph Loop (Coder + Verifier) 运行时长: ~10 分钟 状态: 🔄 进行中(无限递归已修复,但 overlap matrix 计算仍需修复)