数学函数可逆编译(Math Function Compilation)¶
English · 简体中文
类别 C5 · 模块
oracq.infrastructure.mathfunc· 阶段 V2
概述¶
把纯 Python 数学函数(math / cmath 子集)编译为定点可逆量子线路(input model 词汇中的 FO,函数 oracle)。公开契约是 reversible_function 范式:输入保持不变,输出与 status 按位 XOR 更新,所有临时寄存器自动复净——线路实现的是有限字长下的函数 \(\tilde F\),不声称精确表示连续数学函数。编译链为 Python AST → MIR 0.1(有类型 SSA 图)→ 模块化 RIR;初等函数用 Chebyshev–Clenshaw 多项式在配置区间上近似。使用教程见普通数学函数自动生成,MIR 格式见 math-ir。
接口与输入模型¶
compile_function(function, *, fmt=None, inputs=None, constants=None, helpers=None,
output_names=None, config=None, max_unroll=128, entry=None)
lower_math_ir(program, *, fmt=None, config=None, output_names=None)
API 入口:compile_function、lower_math_ir
function:普通函数对象或def源码字符串;源码只允许math/cmath导入与纯函数定义(模块 docstring 与__future__导入被忽略),entry指定多函数源码的入口(缺省最后一个)。inputs:{参数名: "real" | "complex" | "bool" | Index(width)};缺省按注解推断(float/int→ real、complex→ complex、bool→ bool)。constants:生成期常量(含默认参数);helpers:辅助函数命名空间(不支持递归);max_unroll:静态range循环展开上限。fmt:FixedFormat(缺省(12, 6),必须有符号);config:MathConfig(degree=6, intervals=()),degree 为数学核多项式阶数(1..32),intervals 逐函数替换近似区间。lower_math_ir:由 MIR 单独降低(可换 fmt / config),供 JSON 往返后重建。
返回 CompiledFunction(oracq.compile_function 顶层再导出)。属性:
属性 |
含义 |
|---|---|
|
生成的 |
|
入口 |
|
定点格式回显 |
|
参数到物理寄存器的展开(复数拆 |
寄存器为各输入、输出(缺省 out / out_i,可由 output_names 命名)加 status(2 位)。模块属性:oracle_paradigm="reversible_function"、math_function、math_ir_version="0.1"、fixed_width / fixed_fraction、math_config、update_semantics、correctness="pending";入口模块附完整 math_ir JSON。
实现要点¶
前端不执行源码:副作用语句、while、递归、lambda 在编译期拒绝;静态 range 循环展开为直线上;if / 三元表达式 / 布尔短路编译为 select 节点——两分支电路都被计算,未走分支的算术错误经 status 掩码(如 0 if x == 0 else 1/x 在 x = 0 处不置位)。捕获的数值型全局名字与 constants 都成为生成期常量。
MIR 是顺序 SSA 图(节点引用的下标严格小于自身),MathProgram.validate() 校验操作元数与类型约束,dumps / loads JSON 往返。降低器 NumericEmitter 全部使用局部寄存器并在出口 XOR 输出后伴随重放整帧,实现自动 compute / XOR / uncompute;重叠的只读参数按无别名调用 ABI 复制。复数四则与初等函数按恒等式分解为实核(如 \(e^{x+iy} = e^x(\cos y + i\sin y)\),\(\arctan\) 系经 log / sqrt 恒等式);整数指数幂用平方乘(上限 128),一般幂走 \(\exp(b\log a)\);atan2 由幅值比加象限修正合成。
初等核 elementary_kernel:在区间上取 degree+1 个 Chebyshev 节点经典采样、量子侧 Clenshaw 递推求值,配方(区间、阶数、系数)写入模块属性 math_approximation;越出近似区间置 status 位 1,log / asin / atanh 等的定义域违例置位 0(位 0 = 定义域失效、位 1 = 值域 / 字长越界)。核按 (函数名, fmt, config) 缓存复用。Index 输入按无符号整数嵌入定点字的 fraction 偏移处(要求 width + fraction < fmt.width)。适用边界:无自动区间推导、误差证明与最优算术电路选择,近似区间必须覆盖各个中间数学核的输入。
验证方案¶
类别 C5(数据访问层,判定准则见 ../development/validation-plan.md §2):查询语义逐点正确 + 输入保留 / XOR 更新 / 复净。三层证据位于 tests/core/test_mathfunc.py:MathFunctionTests:
结构:
test_helper_module_reuse_and_roundtrip——helper 去重(同一调用点只留一个 call 节点)、MIR JSON 往返、按重建 MIR 降低得到的 RIR 与直接编译逐字节一致;test_source_is_not_executed_and_effects_rejected(副作用 / 递归 /while/ 文件操作被拒且源码不被执行)。数值:
test_all_elementary_families_construct——math/cmath的全部 16 个实初等族在实 / 复输入下构造出闭合程序,polar/rect/conjugate多返回值路径亦覆盖;test_roe_is_a_compiled_pure_function——Euler ROE 面通量整链编译,helper 族标签齐全。另有test_nonzero_output_xor_superposition_and_inverse(叠加输入与非零输出初值下的 XOR 语义、双调用自逆)与test_unused_branch_error_is_masked(未走分支的除零被 status 掩码)。绑定:无独立绑定见证——编译产物是闭合模块、不含抽象槽位,与
validation-coverage.md的 mathfunc 行一致。
已知缺口与计划阶段¶
定点量化误差界的显式见证未补:字长、阶数、区间与系数已进模块属性,但"给定 fmt / degree 下输出偏差不超过多少"没有自动化断言。登记为阶段 V2,与 validation-coverage.md 的 mathfunc 行一致。
数值验证¶
论文级数值实验见 tests/verification/verify_mathfunc.py(真实后端执行,无模拟替身),直接补齐上一节的误差界缺口。实验设计:覆盖 examples/math_functions.py 全部 5 个函数与 applications/roe_formulas.frozen_roe_face(6 实输入 + 2 个 Index(2) + 2 个生成期常量 + 双输出),FixedFormat(6,2)/(8,3) 两种格式;rir-pysparq 叠加穷举(单输入全域 2^6/2^8 分支,多输入逐轴纤维 + 联合立方体,Index 全域 16 组联合)。oracle 为按 fixed_arithmetic 语义独立实现的定点仿真机 _Fx(mul/div/sqrt 幅度向零截断、add/sub 模 wrap、status 位 0 = 定义域失效、位 1 = 值域/字长越界、select 掩码未选分支而 helper 调用合并全部参数旗标、helper 形参不参与折叠),初等核另按 math_approximation 系数逐比特复现 Clenshaw 递推——因此"实现误差"对照的是量化后的系数配方,"方法误差"(配方 vs 真函数)单独报告。结果:除 guarded_reciprocal 外全部案例与 _Fx 仿真逐比特一致(max_error = 0,覆盖数千个无旗标分支),guarded_reciprocal 全域误差 ≤ 1 量子(除法截断界)且全域无旗标;status 旗标(rho=0 除零、rho<0 平方根、c2≤0、z=±i、核区间越界、中间量字长越界含 wrap 后除零)逐分支符合预测(misflagged = 0);三后端(rir-pysparq / reference / adapter-pysparq)振幅两两偏差 0.0;基态确定性(输入保持、输出 XOR、locals 复净)6 函数全过。工作区实测 358–2178 比特,OriginIR-ext 24 比特预算不适用。
案例 |
规模 |
后端路径 |
指标 |
数值 |
|---|---|---|---|---|
polynomial 全域穷举 |
6.2 / 8.3,64 / 256 分支 |
rir-pysparq |
max_error |
0 / 0(exact_fraction 1.0) |
guarded_reciprocal 全域穷举 |
6.2 / 8.3,64 / 256 分支 |
rir-pysparq |
max_error |
0.94 / 0.98 量子(全域 status = 0) |
pressure 纤维 + 立方体 |
两格式,192+64 / 768+64 分支 |
rir-pysparq |
max_error / 常量量化偏差 |
0 / 1.4(6.2)、0 / 0.578(8.3) |
roe_speed 纤维 + 立方体 |
两格式,256+16 / 1024+16 分支 |
rir-pysparq |
max_error |
0 / 0 |
phase_response 纤维 + 立方体 |
两格式,192+16 / 512+16 分支 |
rir-pysparq |
max_error / 方法误差 |
0 / 1.770(6.2)、0 / 1.349(8.3) |
frozen_roe_face 索引联合 + 纤维 |
16 + 96 分支 × 两格式 |
rir-pysparq |
max_error |
0 / 0(left/right 双输出) |
核方法误差(信息性) |
4001 点网格,degree=3 |
经典对照 |
exp / sin / cos |
0.148 / 0.195 / 0.364 |
跨后端对拍(6 案例) |
16–64 分支 |
rir-pysparq / reference / adapter-pysparq |
max_pairwise_deviation |
0.0 |
基态确定性 |
6 函数 |
rir-pysparq |
failures |
0 |
复现命令:
PYTHONPATH=src <含 pysparq+uniqc 的解释器> tests/verification/verify_mathfunc.py
产物:out/verification/mathfunc.json(28 个案例全过,总运行约 185 秒)。
相关链接¶
源码:
src/oracq/infrastructure/mathfunc/(frontend.py/graph.py/numeric.py/lowering.py)使用教程:普通数学函数自动生成可逆量子模块
API 参考:数学函数编译入口
验证矩阵:验证覆盖矩阵