All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cutpool.c
Go to the documentation of this file.
25 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
80 * The columns in a row are divided into two parts: LP columns, which are currently in the LP and non-LP columns;
81 * we sort the rows, but that only ensures that within these two parts, columns are sorted w.r.t. their index.
82 * Normally, this should be suficient, because a column contained in both rows should either be one of the LP columns
84 * However, directly after a row was created, before it is added to the LP, the row is not linked to all its
86 * Therefore, if exactly one of the rows has no LP columns, we cannot rely on the partition, because this row might
87 * just have been created and also columns that are in the LP might be in the non-LP columns part.
115 /* both rows have LP columns, or none of them has, or one has only LP colums and the other only non-LP columns,
127 /* in debug mode, we check that we can rely on the partition into LP columns and non-LP columns */
180 /* one row has LP columns, but the other not, that could be because the one without was just created and isn't
181 * linked yet; in this case, one column could be an LP column in one row and a non-LP column in the other row, so we
182 * cannot rely on the partition; thus, we iteratively check whether the next column of row1 is either the next LP
223 /* current column of row1 is neither the current LP column of row2, nor the current non-LP column of row 2 */
256 keyval = (row->maxidx << 29) + (row->len << 22) + (row->minidx << 11) + maxabsval; /*lint !e701*/
368 /** gets the age of the cut: the number of consecutive cut pool separation rounds where the cut was neither in the LP nor violated */
574 /* decrease the number of removable cuts counter (row might have changed its removable status -> counting might not
704 SCIPdebugMessage("separating%s cut pool %p with %d cuts, beginning with cut %d\n", ( sol == NULL ) ? "" : " solution from", (void*)cutpool, cutpool->ncuts, firstunproc);
738 /* if the cut is a bound change (i.e. a row with only one variable), add it as bound change instead of LP
744 SCIP_CALL( SCIPsepastoreAddCut(sepastore, blkmem, set, stat, eventqueue, eventfilter, lp, sol, row, FALSE, root, &cutoff) );
750 else if( (sol == NULL && SCIProwIsLPEfficacious(row, set, stat, lp, root)) || (sol != NULL && SCIProwIsSolEfficacious(row, set, stat, sol, root)) )
754 SCIProwGetName(row), ( sol == NULL ) ? SCIProwGetLPFeasibility(row, set, stat, lp) : SCIProwGetSolFeasibility(row, set, stat, sol) );
755 SCIP_CALL( SCIPsepastoreAddCut(sepastore, blkmem, set, stat, eventqueue, eventfilter, lp, sol, row, FALSE, root, &cutoff) );
|