Can model.copy() also copy my own data structures of variables in the original model (in Python)?
回答済みGreetings,
I made a model and added binary decision variables into a data structure like the following in Python:
def make_model(some_arguments):
model = grb.Model()
......
x[i,j] = model.addVar(......)
y[i,j] = model.addVar(......)
......
model._data = x, y
return model
Then in another function I can extract those groups of variables, i.e. x, y, like
def solve_model(model):
x, y = model._data
......
Now I want to make a copy of the original model and manipulate the copy and solve it again. the code is something like
copy = model.copy()
This is a good copy of the original model but it does not copy my data structure of x, y. When I call the following function
def solve_copy(copy):
x, y = copy._data
for i in y:
y[i].ub = 0
......
The line of 'x, y = copy._data' will throw an error of 'AttributeError: 'gurobipy.Model' object has no attribute '_data''. then I cannot manipulate y with their upper bounds.
Can anyone give me some suggestions about how to copy a model and its data structures of decision variables simultaneously?
Thanks,
Larry
-
正式なコメント
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum. Or why not try our AI Gurobot?. -
Hello there,
I don't know the policy of this forum regarding duplicate posts.
To avoid posting the same topic, I thus post here to see if anyone has an answer to this, as I also would like to be able to copy a model together with its custom attributes (attributes starting with _)
Thanks a lot,
Regards,
Baptiste0 -
Hi Larry and Baptiste,
I don't suppose there is a way currently to copy user data when calling Model.copy(). I recommend to only use one data object _data to store all your user data and after copying the model call model2._data = model._data.
Cheers,
Matthias0 -
Hi Matthias,
Thanks for your answer.
However for the case described here, using model2._data = model._data will not work, as model._data contains variables from model, model2._data would also contain the variables from model. Here is a minimal working example in Python :
m = Model()
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
m.update()
m._data = [x,y]
m2 = m.copy()
m2._data = m._data
x2,y2 = m2._data
m2.addConstr(x2 + y2 == 1)The addConstr call then throw an error "GurobiError: Variable not in model".
I am not surprised by this though, but it would be nice to be able to make it work "easily".
Of course, you can always create the correct m2._data using
m2._data = [m2.getVarByName("x"), m2.getVarByName("y")]
but it is a bit cumbersome.The usecase I was thinking about is e.g. callbacks, where using custom attributes makes it really easy to access the variables inside the callback. Having the correct variables directly in m2._data make it easier to use e.g. two different callbacks.
But I'll use getVarByName to get it done, the current behavior makes sense in a way, I was just wondering if there was some obscure way to easily do this.
Thanks again,
Regards,
Baptiste0 -
Thank you, Baptiste, for sharing your practice. It's helpful.
Larry
0
投稿コメントは受け付けていません。
コメント
5件のコメント