如何向PySCIPOpt类添加属性

时间:2019-03-25 16:25:40

标签: python cython scip branch-and-bound

问题

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

但是,以经典的Python方式(向对象添加属性)进行操作,这给了我AttributeError

我的怀疑-并没有真正理解正在发生的事情-可能通过“经典” python类实现,但是Variable对象是由PySCIPOpt的底层Cython代码创建的,因此,动态添加属性是不知何故不支持。

对于我的“分支和价格”代码的列生成部分,每当Pricer创建新变量时,我都需要以某种方式存储我的变量代表什么类型的解决方案组件(例如,对于“切削库存”实施,变量对应的切割模式)。我相信通过添加属性在变量上存储其他信息,如果可行的话,将是实现此目的的最优雅的方法。

这是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

返回

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

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

问题

  • 有什么方法可以动态地向变量添加属性?
  • 是否存在另一种/更好的方式来存储有关变量的信息,以便可以在我的整个SCIP例程中对其进行访问(例如,Pricers和Branchrules也应可以对其进行访问)?

1 个答案:

答案 0 :(得分:1)

据我所知,这不可能以动态方式实现。但是,对于某些类(ModelConstraint等),有空白对象占位符可以获取任何Python数据:

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

我想这些应该存在于所有类中。看到这里:https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268