Как добавить атрибуты в классы PySCIPOpt - PullRequest
1 голос
/ 25 марта 2019

Задача

Я использую PySCIPOpt для реализации алгоритма ветвления и цены в SCIP. Я хотел бы добавить дополнительные атрибуты к pyscipopt.scip.Variable объектам (это класс, который PySCIPOpt использует для обработки переменных модели) для хранения дополнительной информации о переменных.

Однако, делая это в классическом Python-способе добавления атрибута к объекту, я получаю AttributeError.

Мое подозрение - без реального понимания того, что происходит - заключается в том, что, хотя это возможно с "классическим" классом python, объекты Variable создаются базовым кодом Cython PySCIPOpt, и поэтому динамическое добавление атрибутов как-то не поддерживается.

Для части генерации столбцов в моем коде Branch and 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

, который возвращает

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

вместо добавления атрибута с именем foo.

Вопрос

  • Есть ли способ динамического добавления атрибутов к переменным?
  • Существует ли другой / лучший способ хранения информации о переменных, чтобы к ней можно было получить доступ в течение всей моей процедуры SCIP (например, она также должна быть доступна для Ценников и Branchrules)?

1 Ответ

1 голос
/ 25 марта 2019

Насколько я знаю, это невозможно динамически. Однако для некоторых классов (Model, Constraint, ...) существуют пустые заполнители объектов, которые могут принимать любые данные Python:

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

Полагаю, они должны существовать для всех классов. Смотрите здесь: https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268

...