Как добавить атрибуты в классы PySCIPOpt

Проблема

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

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

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

Для части генерации столбцов моего кода ветки и цены мне нужно каким-то образом сохранять, всякий раз, когда новая переменная создается ценником, какой тип компонента решения представляет моя переменная (например, для реализации 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 (например, она также должна быть доступна для Pricers и Branchrules)?

person netword    schedule 25.03.2019    source источник
comment
Я ничего не знаю о PySCIPOpt, но если вы наследуете класс Cython, вы сможете добавлять атрибуты к экземплярам унаследованного класса.   -  person DavidW    schedule 25.03.2019
comment
Да, это тоже должно работать, но добавление объекта-заполнителя в сам класс Cython более удобно для пользователя.   -  person mattmilten    schedule 26.03.2019


Ответы (1)


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

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

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

person mattmilten    schedule 25.03.2019
comment
Звучит хорошо; действительно, для Model это работает - однако еще не для Variable. Для пояснения: когда вы говорите они должны существовать для всех классов, вы имеете в виду, что в смысле в настоящее время их нет, но было бы хорошо, если бы они существовали или как в я думаю, что они существуют для всех классов? - person netword; 25.03.2019
comment
Я имел в виду: их еще не существует, но они действительно должны :-) Вы можете создать запрос на перенос на GitHub. - person mattmilten; 25.03.2019