如何向 PySCIPOpt 添加属性 类

How to add attributes to PySCIPOpt classes

问题

我正在使用 PySCIPOpt 在 SCIP 中实现分支和价格算法。我想向 pyscipopt.scip.Variable 对象添加额外的属性(这是 PySCIPOpt 用来处理模型变量的 class)以便存储关于变量的额外信息。

但是,以 class 向对象添加属性的 Python 方式执行此操作会给我一个 AttributeError.

我怀疑 - 没有真正理解发生了什么 - 虽然这可以通过 "classical" python class 实现,但 Variable 对象是由PySCIPOpt 的底层 Cython 代码,因此不支持动态添加属性。

对于我的 Branch 和 Price 代码的列生成部分,每当 Pricer 创建新变量时,我需要以某种方式存储我的变量代表什么类型的解决方案组件(例如,对于 Cutting Stock 实施,将是变量对应的切割模式)。我相信通过添加属性来存储有关变量的附加信息——如果可行的话——是实现此目的的最优雅方式。

这是一个 MWE:

from pyscipopt import Model

s = Model()

new_var = s.addVar(vtype="C", obj = 5)
new_var.foo = {'bar': 'baz'} # some arbitrary information about new_var I want to store

其中 returns

AttributeError: 'pyscipopt.scip.Variable' object has no attribute 'foo'

而不是添加名为 foo 的属性。

问题

据我所知,这是不可能以动态方式实现的。但是,对于某些 类(ModelConstraint、...),存在可以接受任何 Python 数据的空白对象占位符:

cdef class Constraint:
    cdef SCIP_CONS* scip_cons
    cdef public object data

我想这些应该适用于所有人 类。看这里:https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268