Skip to content

【代码贡献】修复 QUBO/Grover 结果寄存器缺少符号位的问题 - #97

Open
youshen2025 wants to merge 2 commits into
OriginQ:developfrom
youshen2025:fix/qubo-signed-register-width
Open

youshen2025 wants to merge 2 commits into
OriginQ:developfrom
youshen2025:fix/qubo-signed-register-width

Conversation

@youshen2025

@youshen2025 youshen2025 commented Sep 22, 2026

Copy link
Copy Markdown

【代码贡献】修复 QUBO/Grover 结果寄存器缺少符号位的问题

队伍 youshen,关联 #13,目标 develop

问题

QuadraticBinary.query_qnumber() 对正数上界按无符号整数计算位数,但
QUBO_GAS_origin 使用结果寄存器最高位判断负数。旧实现对 Q(x)=x 返回一个
结果比特:CPU 实际将 Q(1)=1 编码成 1,按补码解释却是 -1
Q(x)=4x 的结果比特数为 3,正数 4 同样被解释为 -4;相应 oracle 错误标记正值。
全零系数输入返回零个结果比特,无法供 oracle 访问最高位。

NumPy 整数输入还可能在边界计算中溢出:np.int64(-2**63) 的绝对值溢出,
会被分配 1 位而非 64 位;8 个 np.int64(2**61) 相加会绕回零。即使不溢出,
ceil(np.int64(...)) 的浮点转换也可能在整数边界多分配一位。

修复与原理

继续使用现有的正/负系数和作为保守上下界 U/L,不改变多项式建模或查询接口。
m 位补码的可表示范围为 [-2^(m-1), 2^(m-1)-1],因此需要同时容纳两侧边界:

  • 正侧位数:ceil(U).bit_length() + 1,包含符号位。
  • 负侧位数:(max(1, ceil(abs(L))) - 1).bit_length() + 1,允许 -2 的幂落在负边界。
  • 取两侧较大值;全零问题自然保留一个结果比特。

求和前将 NumPy 整数转换为 Python 整数,避免定长累加与绝对值溢出;整数
边界保持精确。使用 bit_length 避免浮点 log2 在大整数/2 的幂附近的舍入错误。
分数边界向外取整数包络,只影响分配;不宣称有限位数能精确编码任意小数。
上界来自各系数符号,是安全但可能不紧的界,不增加指数规模的经典枚举。

仅改 QUBO 的该位数方法及其文档,并替换原来复制实现公式的测试。没有修改
QUBO 二进制幂规范化、QAOA 默认层数、Grover 迭代策略或应用项目。

验证

40 项聚焦测试包含:

  • 全零、正负整数、2 的幂及相邻边界;常数、对角项、非对称交叉系数。
  • 对每个小整数实例的所有输入,真实 CPU 执行算术线路,核验目标补码态概率为 1。
  • 对多种阈值与正/负/零问题,在输入叠加态上运行真实 GAS 符号 oracle,
    比较完整复数振幅与经典条件 Q(x) < threshold,同时核验辅助寄存器回到零态。
  • 分数区间与 2^53 附近的位数边界只检查分配,不运行 54/55 比特模拟。
  • int32/int64/uint64 的求和、最小负值、矩阵及常数边界;只检查分配,
    并将 NumPy 溢出警告提升为异常,确保问题没有被静默掩盖。
  • 原有文档小数例子的结果位数仍为 3。

原先 32 项修复前 17 失败、15 通过;追加的 8 项 NumPy 整数回归修复前
全部失败。最终 Python 3.12.3 完整测试 57 通过,11.53 s(替换原 1 项为
40 项);Python 3.11.16 / 3.13.11 的 40 项聚焦回归均通过(1.18 / 1.15 s)。
新测试 Ruff lint/format、项目虚拟环境依赖检查及 CRLF 感知 Git diff 检查通过。
3.11 保留上游文档字符串转义弃用警告。以上为本地验证,尚无本 PR 的远程 CI 结果。

环境:PyQPanda3 0.4.1;3.12/3.13 的 NumPy 2.5.3、SciPy 1.18.1,
3.11 的 NumPy 2.4.6、SciPy 1.17.1。无硬件、API Key、全局 pip 安装或模拟器 mock。
在已安装项目及 pytest/pytest-timeout/allure-pytest 的项目 .venv 中运行:

OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 .venv/bin/python -m pytest -c test/pytest.ini -o addopts='' test/QAlgBase/Test_QUBO_query_qnumber.py --timeout=60 -q
OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 .venv/bin/python -m pytest -c test/pytest.ini -o addopts='' test --timeout=60 -q

兼容性与查重

受影响输入会按正确的补码边界分配结果比特;溢出案例可能有较大的位数纠正。调用者应使用
返回的大小分配寄存器。很大的整数只验证了位数计算,不代表能够模拟相应量子规模。
浮点表示、分数相位编码精度及输入校验的一般限制不在本次修复范围内。

2026-09-22 检索 query_qnumber / QUBO sign / QUBO 补码,并阅读 #69#45
实际 diff;二者分别修复多项式规范化和默认 QAOA 层数,没有覆盖结果符号位。
本分支直接从官方 develop 5f973ef 创建,仅包含两个现有文件的改动。

附加集成验证:独立本地 checkout 合并应用 #92#95/#96/#97/#98 的当前
修复后,Python 3.11 / 3.12 / 3.13 各 242 项测试全部通过(26.28 / 29.41 /
25.09 s),应用覆盖率均为 98.92%。其他 PR 的改动没有加入本分支;这些是
本地兼容性证据,不代替上游审核或 CI。

合并交互检查:另在本地合并第三方开放 #45(f829357)、#69(6f0fcb2)、
#36(e1992fb),均自动合并无冲突;Python 3.12 的 264 项测试通过(37.15 s),
应用覆盖率 98.92%。该记录仅覆盖这些提交的本地兼容性;他人的代码不进入本 PR。

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