如何向 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
的属性。
问题
- 有什么方法可以给变量动态添加属性吗?
- 是否有 different/better 存储变量信息的方法,以便可以在我的整个 SCIP 例程中访问它(例如,它也应该可以被 Pricers 和 Branchrules 访问)?
据我所知,这是不可能以动态方式实现的。但是,对于某些 类(Model
、Constraint
、...),存在可以接受任何 Python 数据的空白对象占位符:
cdef class Constraint:
cdef SCIP_CONS* scip_cons
cdef public object data
我想这些应该适用于所有人 类。看这里:https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268
问题
我正在使用 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
的属性。
问题
- 有什么方法可以给变量动态添加属性吗?
- 是否有 different/better 存储变量信息的方法,以便可以在我的整个 SCIP 例程中访问它(例如,它也应该可以被 Pricers 和 Branchrules 访问)?
据我所知,这是不可能以动态方式实现的。但是,对于某些 类(Model
、Constraint
、...),存在可以接受任何 Python 数据的空白对象占位符:
cdef class Constraint:
cdef SCIP_CONS* scip_cons
cdef public object data
我想这些应该适用于所有人 类。看这里:https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268