参数精度#
参数精度转化要求#
在对实际问题进行建模时,常常得到QUBO形式,再将其转化成Ising模型就可以应用于物理机了。QUBO模型需要转化为
Ising模型 以用于实际的物理计算
实际计算中,系数位宽受到物理上硬件条件的限制,只能取有限的范围。
1.CIM真机只支持8bit INT空间[-128, 127]
2.用户建模要保证转换完的Ising矩阵符合要求
3.提供的转换逻辑供参考,用户可以根据自己的矩阵使用更适合的方法
QUBO转化为Ising#
本节介绍QUBO如何转化为Ising,以便于理解动态范围检查如何限制QUBO矩阵。
QUBO模型如下:
在计算之前需要将其转化为Ising矩阵。
令 ,
QUBO变量满足 ,可以用矩阵的对角线元素表达一次项。而Ising模型
,不能这样表示。
上式中的一次项通过添加辅助变量 化为二次项,辅助变量取1和-1时可以分别对应到添加辅助变量前的两组解。故添加辅助变量后与原问题等价。
常数项单独记录,在计算最终哈密顿量时加上即可。
举例:
经过变换之后为
kaiwuSDK降低精度的方法#
kaiwuSDK提供了两种降低参数精度的方法,perform_precision_adaption_mutate和perform_precision_adaption_split。 mutate方法在修改矩阵的同时能够保持矩阵的解不变,但能够改变精度的程度取决于矩阵本身的可下降空间。 split方法能够将矩阵修改到任意精度,但是新矩阵的比特数随着精度变化量增长较快
perform_precision_adaption_mutate#
1 动态范围#
1.1 QUBO矩阵相关定义
定义 Q为qubo矩阵, 表示Q的最优解包含于Q'的最优解
定义 为对Q的每个元素round取整
1.2 动态范围相关定义
定义 为X元素的最大距离
为X元素的最小距离
为X的动态范围
命题 , 那么
通过减小动态范围,可以降低原矩阵所需要的参数精度
2. 应用举例#
import kaiwu as kw
import numpy as np
mat0 = np.array([[0, -20, 0, 40, 1.1],
[0, 0, 12240, 1, 120],
[0, 0, 0, 0, -10240],
[0, 0, 0, 0, 2.05],
[0, 0, 0, 0, 0]])
mutated_mat = kw.preprocess.perform_precision_adaption_mutate(mat0)
print(mutated_mat)
perform_precision_adaption_split#
1. 参数精度#
由于当前量子计算机对QUBO系数的存储方式为定点数,且只有8位精度,对于最大最小值的比值超过 的多项式,需要将系数大的项分拆。
实现方式为将原式中的比特替换成值相等的多个等价比特,相等条件由约束项实现,从而使得每一项的系数都能够缩小。
以QUBO表达式为例,拆分的方式为将 转化为
例如,对于 ,要求多项式系数最大最小值的比值不能超过150,
阈值设置为那么将多项式修改为
2. 应用举例#
import kaiwu as kw
import numpy as np
mat = np.array([[0, -15,0, 40],
[-15,0, 0, 1],
[0, 0, 0, 0],
[40, 1, 0, 0]])
splitted_ret, last_idx = kw.preprocess.perform_precision_adaption_split(mat, 4)
print(splitted_ret)
min_increment计算得到默认值为1。精度设置为4个比特,范围在-7到7,绝对应该小于7。
程序输出转换后的矩阵如下:

如图所示,红色的箭头指示出拆分前后的对应关系。蓝色框中的数字则是用于限制新建的变量的值保持一致的惩罚项。 通过这样拆分变量,可以在保持原矩阵的解的情况下,将参数精度降低。
降低精度的过程通过param_bit,min_increment,penalty, round_to_increment等参数来调节。
矩阵的值都是min_increment的整数倍,默认取矩阵元素间的最小正差值
round_to_increment表示在这个过程中,通过调整各个元素,使得拆分后的元素的和等于原值。 如15拆分成7.5+7.5,若分别近似取整会变成8+8。设置reduce_error=True,15会自动拆分为7+8
splitted_ret2, last_idx2 = kw.preprocess.perform_precision_adaption_split(mat, 4, min_increment=3, round_to_increment=True)
print(splitted_ret2)
结果为
[[ 0. 21. -6. 0. 3. 12.]
[21. 0. -9. 0. 12. 12.]
[-6. -9. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0.]
[ 3. 12. 0. 0. 0. 21.]
[12. 12. 0. 0. 21. 0.]]
对拆分后精度满足要求的矩阵进行求解后,可以通过restore_splitted_solution将其恢复成原矩阵的解
worker = kw.cim.SimulatedCIMOptimizer(iterations=1000)
output = worker.solve(splitted_ret)
opt = kw.sampler.optimal_sampler(splitted_ret, output, bias=0, negtail_ff=False)
sol = opt[0][0]
org_sol = kw.preprocess.restore_splitted_solution(sol, last_idx)
print(org_sol)
结果为
[-1. 1. -1. -1.]
PrecisionReducer#
为了方便用户在SDK中迭代调用CIM量子计算机,SDK提供了PrecisionReducer, 它应用了装饰模式(一种软件设计模式)。 当用户需要在提交量子计算机求解时,可以在CIMOptimizer之外再讨一个PrecisionReducer,然后把PrecisionReducer作为Optimizer传给Solver。 详情参见