【问题标题】:How to add attributes to PySCIPOpt classes如何向 PySCIPOpt 类添加属性
【发布时间】:2019-03-25 16:25:39
【问题描述】:

问题

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

但是,以经典的 Python 方式向对象添加属性,这会给我一个 AttributeError

我的怀疑 - 没有真正理解发生了什么 - 虽然这是可能的“经典”python 类,Variable 对象是由 PySCIPOpt 的底层 Cython 代码创建的,因此,动态添加属性在某种程度上不是支持。

对于我的 Branch 和 Price 代码的列生成部分,我需要以某种方式存储,每当 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 访问)?

【问题讨论】:

  • 我对 PySCIPOpt 一无所知,但如果你从 Cython 类继承,你应该能够为继承类的实例添加属性
  • 是的,这也应该可以,但是向 Cython 类本身添加一个占位符对象更加用户友好。

标签: python cython scip branch-and-bound


【解决方案1】:

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

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

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

【讨论】:

  • 这听起来不错;事实上,对于Model,它可以工作——但是,对于Variable,还没有。澄清一下:当你说这些应该存在于所有类时,你的意思是在它们目前不存在的意义上,但如果它们存在会很好或如 我认为它们存在于所有类中 ?
  • 我的意思是:它们还不存在,但它们确实应该存在 :-) 欢迎您在 GitHub 上创建拉取请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多