Get solution value of variable by name in pySCIPopt

439 Views Asked by At

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")))
1

There are 1 best solutions below

1
On

You can do something like this:

x = {} #dictionary of variables
x['y']=model.addVar("y", vtype="I", lb=0, ub=10)

In this way if you need to implement the getByName(String Name), you can do something like

def getByName(val):
    x[val] = model.getVal(x[val])