วิธีเพิ่มแอตทริบิวต์ให้กับคลาส PySCIPOpt

ปัญหา

ฉันใช้ PySCIPOpt เพื่อใช้อัลกอริทึมสาขาและราคาใน SCIP ฉันต้องการเพิ่มแอตทริบิวต์เพิ่มเติมให้กับวัตถุ pyscipopt.scip.Variable (นี่คือคลาสที่ PySCIPOpt ใช้เพื่อจัดการตัวแปรโมเดล) เพื่อจัดเก็บข้อมูลเพิ่มเติมเกี่ยวกับตัวแปร

อย่างไรก็ตาม การทำเช่นนี้ด้วยวิธี Python แบบคลาสสิกในการเพิ่มแอตทริบิวต์ให้กับวัตถุ ทำให้ฉันได้ AttributeError

ความสงสัยของฉัน - โดยไม่เข้าใจจริงๆว่าเกิดอะไรขึ้น - แม้ว่าสิ่งนี้จะเป็นไปได้ด้วยคลาสหลาม "คลาสสิก" แต่วัตถุ Variable นั้นถูกสร้างขึ้นโดยโค้ด Cython พื้นฐานของ PySCIPOpt ดังนั้นจึงไม่รองรับการเพิ่มแอตทริบิวต์แบบไดนามิก

สำหรับส่วนการสร้างคอลัมน์ของรหัสสาขาและรหัสราคาของฉัน ฉันต้องจัดเก็บเมื่อใดก็ตามที่ตัวแปรใหม่ถูกสร้างขึ้นโดย 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 ควรสามารถเข้าถึงได้ด้วย)

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