Bagaimana cara menambahkan atribut ke kelas PySCIPOpt

Masalah

Saya menggunakan PySCIPOpt untuk mengimplementasikan algoritma cabang dan harga di SCIP. Saya ingin menambahkan atribut tambahan ke objek pyscipopt.scip.Variable (ini adalah kelas yang digunakan PySCIPOpt untuk menangani variabel model) untuk menyimpan informasi tambahan tentang variabel.

Namun, melakukan ini dengan cara Python klasik menambahkan atribut ke suatu objek, memberi saya AttributeError.

Kecurigaan saya - tanpa benar-benar memahami apa yang terjadi - adalah bahwa meskipun hal ini dimungkinkan dengan kelas python "klasik", objek Variable dibuat oleh kode Cython yang mendasari PySCIPOpt dan oleh karena itu, penambahan atribut secara dinamis tidak didukung.

Untuk bagian pembuatan kolom dari kode Cabang dan Harga saya, saya perlu menyimpan, setiap kali variabel baru dibuat oleh Pricer, jenis komponen solusi apa yang diwakili oleh variabel saya (misalnya untuk implementasi Pemotongan Stok, itu akan menjadi pola pemotongan variabelnya sesuai dengan). Saya percaya menyimpan informasi tambahan pada variabel dengan menambahkan atribut akan - jika berhasil - menjadi cara paling elegan untuk mencapai hal ini.

Inilah 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

yang kembali

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

alih-alih menambahkan atribut bernama foo.

Pertanyaan

  • Apakah ada cara untuk menambahkan atribut ke variabel secara dinamis?
  • Apakah ada cara yang berbeda/lebih baik untuk menyimpan informasi pada variabel sehingga dapat diakses di seluruh rutinitas SCIP saya (misalnya, informasi tersebut juga harus dapat diakses oleh Pricers dan Branchrules)?

person netword    schedule 25.03.2019    source sumber
comment
Saya tidak tahu apa-apa tentang PySCIPOpt, tetapi jika Anda mewarisi dari kelas Cython, Anda harus dapat menambahkan atribut ke instance kelas yang diwarisi   -  person DavidW    schedule 25.03.2019
comment
Ya, ini juga seharusnya berfungsi, tetapi menambahkan objek placeholder ke kelas Cython itu sendiri lebih ramah pengguna.   -  person mattmilten    schedule 26.03.2019


Jawaban (1)


Sejauh yang saya tahu, hal ini tidak mungkin dilakukan secara dinamis. Namun, untuk beberapa kelas (Model, Constraint, ...), ada placeholder objek kosong yang dapat mengambil data Python apa pun:

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

Saya kira ini harus ada untuk semua kelas. Lihat di sini: https://github.com/SCIP-Interfaces/PySCIPOpt/issues/268

person mattmilten    schedule 25.03.2019
comment
Ini terdengar bagus; memang, untuk Model berhasil - namun, belum untuk Variable. Untuk klarifikasi: ketika Anda mengatakan ini harus ada untuk semua kelas, apakah yang Anda maksud adalah saat ini tidak ada, tetapi akan lebih baik jika ada atau seperti pada Saya pikir mereka ada untuk semua kelas ? - person netword; 25.03.2019
comment
Yang saya maksud adalah: Mereka belum ada, tetapi seharusnya :-) Anda dipersilakan untuk membuat permintaan pull over di GitHub. - person mattmilten; 25.03.2019