[Scip] Separation in Diving Mode

Jonas Witt jonas.witt at rwth-aachen.de
Thu Jul 18 11:56:21 MEST 2013


Hi all,

I have written a separator (in GCG but I have a SCIP problem) which 
holds a non-basic feasible solution x and tries to separate this 
solution by applying the follwing strategy:
It calculates a basic feasible solution x* , generates cutting planes 
which cut off x* and adds all generated cutting planes which also cut 
off x to the separation storage. I call SCIPstartDive(), change the dive 
objective by SCIPchgVarObjDive() and obtain x* by solving the dive LP 
(SCIPsolveDiveLP()). Then I call SCIPseparateSol() with solution NULL 
and store the cuts which cut off x.

This works fine, but sometimes there are some problems with the function 
SCIProwGetObjParallelism() which is called when adding a cut to the 
separation storage. It calculates the scalar of 
row*lpobj/||row||*||lpobj|| where || || is the square norm. Since it 
uses the current LP's objective function (which has changed due to 
SCIPchgVarObjDive()), some of the values stored in the row or the 
current LP are wrong. This leads to a wrong calculation and for example 
to the following error:
src/scip/lp.c:6731: SCIProwGetObjParallelism: Assertion 
`SCIPsetIsSumLE(set, parallelism, 1.0)' failed.

I tried to set lp->objsquarenormunreliable = TRUE in 
SCIPlpMarkDivingObjChanged() and in SCIPendDive(). First, this worked 
for me. But now the problem occurred again. Should I recalculate the 
norms which are stored in the row everytime I call 
SCIProwGetObjParallelism() or is there an easier way to avoid errors 
like that?

Best regards,
Jonas


More information about the Scip mailing list