【代码贡献】修复 QUBO/Grover 结果寄存器缺少符号位的问题 - #97
Open
youshen2025 wants to merge 2 commits into
Open
youshen2025 wants to merge 2 commits into
youshen2025 wants to merge 2 commits into
Conversation
This was referenced Sep 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
【代码贡献】修复 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 项聚焦测试包含:
比较完整复数振幅与经典条件
Q(x) < threshold,同时核验辅助寄存器回到零态。并将 NumPy 溢出警告提升为异常,确保问题没有被静默掩盖。
原先 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中运行:兼容性与查重
受影响输入会按正确的补码边界分配结果比特;溢出案例可能有较大的位数纠正。调用者应使用
返回的大小分配寄存器。很大的整数只验证了位数计算,不代表能够模拟相应量子规模。
浮点表示、分数相位编码精度及输入校验的一般限制不在本次修复范围内。
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。