Skip to content

【代码贡献】修复 QAOA 重复调用时沿用旧线路层数的问题 - #104

Open
youshen2025 wants to merge 1 commit into
OriginQ:developfrom
youshen2025:fix/qaoa-repeated-depth
Open

youshen2025 wants to merge 1 commit into
OriginQ:developfrom
youshen2025:fix/qaoa-repeated-depth

Conversation

@youshen2025

Copy link
Copy Markdown

队伍 youshen,关联本源杯任务 #13,目标分支 develop。

问题与结果

同一个 QAOA 实例先调用一层 run_qaoa_circuit,再传入两层角度时,原代码
仍使用第一次缓存的 self.layer,静默忽略第二层。反过来从多层切到少层会
触发 IndexError。这会使复用对象的深度扫描得到错误结果。

下面第二次调用应等价于新实例的两层调用;在原版上,完整分布的最大绝对差约
0.10628。修复后与独立稠密状态演化逐项一致(绝对容差 1e-12)。

import sympy as sp
from pyqpanda_alg.QAOA.qaoa import QAOA

x0, x1 = sp.symbols('x0 x1')
f = 0.2 + 0.7*x0 - 1.1*x1 + 1.3*x0*x1
solver = QAOA(f)
solver.run_qaoa_circuit([0.31], [0.17])
actual = solver.run_qaoa_circuit([0.31, -0.47], [0.17, 0.29])
expected = QAOA(f).run_qaoa_circuit([0.31, -0.47], [0.17, 0.29])
print(max(abs(actual.get(k, 0) - expected.get(k, 0)) for k in expected))

改动及接口约定

  • 每次构造线路按当前 gamma/beta 序列确定层数,并更新 self.layer。
  • 两个序列长度不同时明确抛出 ValueError,不再截断或出现索引异常;层数和
    成功运行计数保持不变,后续合法调用仍可正常执行。
  • 保留直接线路接口的零层行为:两个空序列只运行初态制备。优化器 run(layer=...)
    的正整数层数约定不变。
  • 补充公开接口说明和 16 项回归。两个文件、一个聚焦提交,不修改模拟器、
    求解目标、优化策略或依赖。

数学验证与测试

测试对成本 0.2 + 0.7*x0 - 1.1*x1 + 1.3*x0*x1 独立计算全部基态能量,
逐层施加 diag(exp(-i*gamma*E)) 及解析 RX(-2*beta) 张量积,将完整概率
与真实 PyQPanda3 CPUQVM 比较。数学基线不调用库的成本转换或线路构造函数。

覆盖符号/Pauli 输入,0/1/2/3 层增减,list/tuple/NumPy 角度,空/不等长序列,
错误输入后的恢复,以及真实 SLSQP 默认和 INTERP 优化与直接调用交替使用。
测试采用固定角度和精确概率,不依赖测量抽样、全局最优命中或模拟器 mock。

  • 原上游 5f973ef:原有 18 项测试通过(7.58 s);16 项新回归全部失败。
  • 修复后 Python 3.12.3:完整运行 33 通过、1 失败(10.72 s);16 项新回归
    全部通过。失败为未修改的原有 Test_QUBO_GAS_origin_run.py 随机 GAS 最优解
    断言,单独重跑该项一次通过(1.52 s)。两次记录均保留,未修改原测试。
  • Python 3.11.16 / 3.13.11:16 项新回归各通过(4.76 / 4.54 s)。
  • Ruff lint/format、pip check、保留原文件 CRLF 的 diff 检查通过。

运行方法(项目 .venv 安装 PyQPanda3 与现有测试依赖后):

OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 PYTHONPATH=pyqpanda-algorithm .venv/bin/python -m pytest -c test/pytest.ini -o addopts='' test/QAOA/Test_qaoa_repeated_depth.py --timeout=60 -q

测试沿用 test/pytest.ini 实际识别的 Test_*.py 命名,以便完整测试自动收集。
使用 PyQPanda3 0.4.1、项目内 Python 3.11–3.13 虚拟环境,没有硬件或凭据要求。

查重及范围

2026-09-26 检索全部开放 PR 和含 layer/depth/层数的历史 PR,并核对 #40、#45、
#61、#96 的实际范围。#45 修复 QUBO 包装器的 layer=None 默认值;本次处理
QAOA 实例跨调用复用的线路深度,两者独立。本 PR 不包含已有寄存器、XY mixer、
风险目标或 GAS 修复,也不依赖这些尚未合并的 PR。

这是线路正确性修复,不声明量子优势、全局最优保证或官方 CI 已通过。

附加兼容性验证:临时 checkout ca2e0ef 合并当前应用 #92、四项独立库修复
#95/#96/#97/#98 与本次修复,Python 3.12.3 的 266 项测试通过(33.97 s),
应用核心覆盖率 98.93%。这些其他 PR 的代码没有混入本分支;此为本地兼容
证据,不替代官方 CI 或维护者审核。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants