kaiwu.cim package#

Module contents#

模块: cim

Function: Provide a range of CIM solver related tools

class kaiwu.cim.PrecisionReducer(component: OptimizerBase, precision=8, target_bits=None, only_feasible_solution=True, truncated_precision=20)#

基类:OptimizerBase

降低精度装饰类

可打开日志看到详细输出:kw.common.set_log_level("DEBUG")

Args:

component (OptimizerBase): 基础类.

precision (int): 矩阵目标精度.

target_bits (int): 矩阵目标比特数. 默认为None,不进行控制

only_feasible_solution (bool): 是否只要可行解,默认True,当only_feasible_solution=True且所有解都不是可行解时会抛出异常

truncated_precision (int): 截断精度,可以计算的最大精度,建议使用默认值

Examples:
>>> import numpy as np
>>> import kaiwu as kw
>>> matrix = -np.array([[ 0. ,  1.23 ,  0. ,  1. ,  1. ],
...                     [ 1.23 ,  0. ,  0. ,  1.,   1. ],
...                     [ 0. ,  0. ,  0. ,  1.,   1. ],
...                     [ 1. ,  1.,   1. ,  0. ,  1. ],
...                     [ 1. ,  1.,   1. ,  1. ,  0. ]])
>>> optimizer = kw.classical.SimulatedAnnealingOptimizer(initial_temperature=100,
...                                                      alpha=0.99,
...                                                      cutoff_temperature=0.001,
...                                                      iterations_per_t=10,
...                                                      size_limit=5)
>>> new_optimizer = kw.cim.PrecisionReducer(optimizer, precision=4)
>>> new_optimizer.solve(matrix) 
array([[ 1, -1, -1, -1,  1],
       [ 1, -1,  1, -1, -1],
       [ 1, -1,  1, -1,  1],
       [-1, -1, -1,  1,  1],
       [ 1,  1,  1, -1, -1]])
solve(ising_matrix=None)#

求解

on_matrix_change()#

更新矩阵相关信息, 继承OptimizerBase时可以实现。当处理的ising矩阵发生变化时,这个函数的实现会被调用,从而有机会做相应动作

set_matrix(ising_matrix)#

设置矩阵并更新相关内容

class kaiwu.cim.CIMOptimizer(user_id, sdk_code, task_name=None, machine_name=None, wait=False, interval=1)#

基类:OptimizerBase

CIM Optimizer Interface

CIMOptimizer 是一种用于求解 Ising 计算问题的优化器 (Optimizer),它通过提交任务到 相干光计算机 (CIM, Coherent Ising Machine) 真机进行计算,并返回最优解。

主要功能包括:

  1. 任务提交:将 Ising 矩阵任务上传至 CIM 计算平台,并创建计算任务。

  2. 任务查询:定期检查任务计算状态,获取计算结果。

  3. 缓存管理:本地缓存已计算任务的结果,避免重复提交。

Args:

user_id (str): 用户 ID,用于身份验证。

sdk_code (str): SDK 授权码,用于访问 CIM 计算服务。

task_name (str, optional): 任务名称,可用于标识任务,默认值为 None。

machine_name (str, optional): 指定计算机型号,默认为 CPQC-550(550 比特真机)。

wait (bool, optional): 是否等待计算完成,默认为 False。

interval (int, optional): 轮询间隔时间(分钟),默认值为 1,最小值 1 分钟。

Example:
>>> import numpy as np
>>> import kaiwu as kw
>>> kw.common.CheckpointManager.save_dir = '/tmp'
>>> matrix = -np.array([[ 0. ,  1. ,  0. ,  1. ,  1. ],
...                     [ 1. ,  0. ,  0. ,  1.,   1. ],
...                     [ 0. ,  0. ,  0. ,  1.,   1. ],
...                     [ 1. ,  1.,   1. ,  0. ,  1. ],
...                     [ 1. ,  1.,   1. ,  1. ,  0. ]])
>>> optimizer = kw.cim.CIMOptimizer(user_id='1241241515', sdk_code='absd1232')  
>>> solution = optimizer.solve(matrix)  
>>> print(solution)  
array([[-1,  1,  1, -1, -1],
       [-1,  1,  1,  1, -1],
       [-1,  1,  1, -1,  1],
       [ 1, -1, -1, -1,  1],
       [ 1, -1,  1,  1, -1],
       [ 1, -1,  1, -1,  1],
       [ 1, -1,  1, -1, -1],
       [ 1, -1, -1,  1,  1],
       [-1, -1, -1,  1,  1],
       [ 1,  1,  1, -1, -1]], dtype=int8)
Notes:
  1. 需要通过 CheckpointManager 设置中间文件保存路径 (save_dir)。

  2. 任务的唯一标识由 ising_matrixtask_name 共同决定,任何一项的变化都会创建新的任务。

  3. 同一个矩阵可以通过修改 task_name 创建不同的任务,若仅需查询结果,请确保 task_name 不变。

get_machine_info()#

获取真机信息和对应配额

Returns:

dict: 真机信息和对应配额, 形如:

{

"CPQC-1": 99, "CPQC-550": 93

}

set_machine_name(machine_name)#

设置机器名称

Args:

machine_name (str): 机器名称

Returns:

dict: None

solve(ising_matrix=None, task_name=None)#

入口函数

Args:

ising_matrix (np.ndarray): Ising矩阵

task_name (str): 任务名称, 这里的task_name设置具有高优先级,会覆盖实例化时设置的task_name,创建实例时没有指定的话,这里必须指定

Returns:
np.ndarray | None:
  • 解向量集合(任务完成时)

  • None(任务仍在计算中)

on_matrix_change()#

更新矩阵相关信息, 继承OptimizerBase时可以实现。当处理的ising矩阵发生变化时,这个函数的实现会被调用,从而有机会做相应动作

set_matrix(ising_matrix)#

设置矩阵并更新相关内容

class kaiwu.cim.OptimizerBase#

基类:object

Ising求解器基类

set_matrix(ising_matrix)#

设置矩阵并更新相关内容

on_matrix_change()#

更新矩阵相关信息, 继承OptimizerBase时可以实现。当处理的ising矩阵发生变化时,这个函数的实现会被调用,从而有机会做相应动作

solve(ising_matrix=None)#

求解