4

I am modeling a large linear program using the Python CyLP package to access the COIN-OR CLP solver, and would like to create a copy of the model to facilitate a future warm start. Simply assigning the model to a new variable creates a shallow copy (copy by reference), and does not preserve the benefits of saving a snapshot (I am modifying the original model, and want to come back to warm start from the copy point). If I use copy.deepcopy(), I get exceptions when modifying the copy model. Attempting to solve the copy kills my python kernel with a Segmentation 11 fault.

E.g.:

from copy import deepcopy
from cylp.cy import CyClpSimplex

model1 = CyClpSimplex()
x = model1.addVariable('x',1)
y = model1.addVariable('y',1)
# Add constraints to model:
model1 += 2*x +   y >= 4
model1 +=   x + 2*y >= 5
model1.objective = x + y
model1.primal()
# Produces correct solution, accessed through

# Save a copy for reference:
model2 = deepcopy(model1)

# Do a bunch of stuff to model1, and now come back to work with model2:
model2.objective = 2*x + y

>> Exception: To set the objective function of CyClpSimplex set cylpSimplex.cyLPModel first

model2.primal() kills my Python instance, with a Segmentation 11 fault.

Does anyone know what could be causing the exception and/or the fatal error?

emunsing
  • 9,536
  • 3
  • 23
  • 29
  • Good question. [This](http://stackoverflow.com/questions/18364284/python-deepcopy-does-not-work-on-user-defined-classes) and the linked answer could be of some help. – Ioannis Aug 22 '15 at 19:42

1 Answers1

0

This doesn't answer the question, but for any newcomers curious about how to get a deep-copy, the only way I know of currently is to write the model to a .mps or .lp file and read the model back into a new CyClpSimplex object, like as follows:

model1.writeLp('model1.lp')
model2 = CyClpSimplex()
model2.readLp('model1.lp')
Sean Kelley
  • 131
  • 5