I want to get the solution value of a model variable by name in pySCIPopt.
It should be something like model.getSolByName("x")
.
Is this possible? (I didn't find anything like this.) I wrote my own child class of Model to do this, but wonder if there is a built in method.
from pyscipopt import Model
# ==========================================================
class myModel(Model):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self._varByName = {}
def __add__(self,constraint):
if type(constraint) == tuple:
cnstr = constraint[0]
name = constraint[1]
else:
cnstr = constraint
name = ""
self.addCons(cnstr,name=name)
return self
def addVar(self,*args,**kwargs):
var = args[0]
obj = super().addVar(*args,**kwargs)
self._varByName[var] = obj
return obj
def optimize(self):
super().optimize()
self.sol = self.getBestSol()
def varByName(self,name):
return self._varByName[name]
def solByName(self,name):
return self.sol[self._varByName[name]]
# ==========================================================
model = myModel("Example")
x = model.addVar("x")
y = model.addVar("y",vtype="INTEGER")
model += 2*x - y*y >= 3, "cnst01"
model += y >= 1
model.setObjective(x + y)
model.setIntParam("display/verblevel",1)
model.optimize()
print("Status:",model.getStatus())
print("solByName('x') = %s" % (model.solByName("x")))
print("solByName('y') = %s" % (model.solByName("y")))
You can do something like this:
In this way if you need to implement the getByName(String Name), you can do something like