Задача
Я использую 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)?