44#define SEPA_NAME "flower"
45#define SEPA_DESC "flower cut separator"
46#define SEPA_PRIORITY 100000
48#define SEPA_MAXBOUNDDIST 1.0
49#define SEPA_USESSUBSCIP FALSE
50#define SEPA_DELAY FALSE
52#define DEFAULT_MIN_OVERLAPS 1
53#define DEFAULT_SCAN_AND TRUE
54#define DEFAULT_SCAN_PRODUCT FALSE
55#define DEFAULT_MAX_STANDARD 0
56#define DEFAULT_MAX_ONEFLOWER 10000000
57#define DEFAULT_MAX_TWOFLOWER 10000000
58#define DEFAULT_DELAY_STANDARD FALSE
59#define DEFAULT_MAX_USELESS_ONEFLOWER 1
60#define DEFAULT_MAX_USELESS_TWOFLOWER 1
69#ifdef USE_OLD_ONEFLOWER_SEPARATION
70#define MAXNSEPA_ONEFLOWER_PER_BASE 2
74struct SCIP_Hypergraph_NodeData
82struct SCIP_Hypergraph_EdgeData
93struct SCIP_Hypergraph_OverlapData
125 int maxuselessoneflower;
126 int maxuselesstwoflower;
127 int nuselessoneflower;
128 int nuselesstwoflower;
147 int memvertices = 32;
174 if( conshdlr !=
NULL )
182 for(
int i = 0;
i < nconss; ++
i )
192 if( nvertices > memvertices )
198 memvertices = newcapacity;
202 for(
int j = 0; j < nvertices; ++j )
209 vertexdata->var =
vars[j];
216 edgedata->coefficient = 1.0;
225 if( conshdlr !=
NULL )
241 for(
int c = 0;
c < nconss; ++
c )
256 if( exprvar ==
NULL )
262 if( nvertices > memvertices )
268 memvertices = newcapacity;
271 for( j = 0; j < nvertices; ++j )
284 vertexdata->var = auxvar;
295 edgedata->var = exprvar;
315 sepadata->timehypercreation += time;
329#ifdef PRINT_HYPERGRAPH_AND_EXIT
381 vertexdata->coefscale = 1.0 /
MAX(ub, feastol);
382 vertexdata->solval = value * vertexdata->coefscale;
397 for(
int i = 0;
i < size; ++
i )
402 edgedata->coefscale = 1.0 / (edgedata->coefficient * ubprod);
403 edgedata->coefscale =
MIN(edgedata->coefscale, 1.0 / feastol );
404 edgedata->solval = value * edgedata->coefscale;
405 edgedata->slackval = edgedata->solval - 1.0;
406 for(
int i = 0;
i < size; ++
i )
423 overlapdata->minedgecomplement = 2.0;
424 overlapdata->sumnodecomplements = 0.0;
427 for(
int i = 0;
i < nvertices; ++
i )
432 overlapdata->sumnodecomplements += 1.0 - vertexdata->solval;
454 edgecomplement = 1.0 - edgedata->solval;
455 if( edgecomplement < overlapdata->minedgecomplement )
457 overlapdata->minedgecomplement = edgecomplement;
458 overlapdata->minedge = edge;
547 && nseparated < maxnsepa; ++edge )
556 for(
int i = 0;
i < size && *presult !=
SCIP_CUTOFF && nseparated < maxnsepa; ++
i )
570 vars[0] = vertexdata->var;
571 vars[1] = edgedata->var;
572 coefs[0] = 1.0 * vertexdata->coefscale;
573 coefs[1] = -1.0 * edgedata->coefscale;
585 sepadata->nsepastandard += nseparated;
597#ifdef USE_OLD_ONEFLOWER_SEPARATION
623 if( hypergraph ==
NULL )
636 && nseparated < maxnsepa; ++base )
641 int nbaseseparated = 0;
664 gain = adjacentdata->solval - 1.0;
681 for(
int i = 0;
i < nbasevertices; ++
i )
699 if( nbaseseparated > MAXNSEPA_ONEFLOWER_PER_BASE )
706 sepadata->nsepaoneflower += nseparated;
744 if( hypergraph ==
NULL)
773 for( ;
i < beyond; ++
i )
781 gain = overlapdata->sumnodecomplements - overlapdata->minedgecomplement;
782 if( gain > bestgain )
785 bestoverlap = overlap;
796 int noverlapvertices;
812 for(
i = 0;
i < nbasevertices; ++
i )
819 for(
i = 0;
i < noverlapvertices; ++
i )
833 sepadata->nsepaoneflower += nseparated;
849#ifdef USE_OLD_TWOFLOWER_SEPARATION
866 int* markedvertices =
NULL;
878 if( hypergraph ==
NULL)
898 int nbaseseparated = 0;
915 gain1 = adjacent1data->solval - 1.0;
922 markedvertices[v] = 1;
956 gain2 = gain1 + adjacent2data->solval - 1.0;
979 for(
int i = 0;
i < nbasevertices; ++
i )
1005 if( nbaseseparated > 2 )
1018 sepadata->nsepatwoflower += nseparated;
1057 if( hypergraph ==
NULL)
1093 for( i1 = first; i1 < beyond; ++i1 )
1104 if( overlap1size > basesize / 2)
1108 gain1 = overlap1data->sumnodecomplements - overlap1data->minedgecomplement;
1110 for( i2 = i1 + 1; i2 < beyond; ++i2 )
1117 if( (overlap1size + overlap2size > basesize)
1118 || ((overlap1size == overlap2size) && (overlap1 >= overlap2))
1129 gain2 = overlap2data->sumnodecomplements - overlap2data->minedgecomplement;
1130 totalgain = gain1 + gain2;
1132 if( totalgain > bestgain )
1134 bestgain = totalgain;
1135 bestoverlap1 = overlap1;
1136 bestoverlap2 = overlap2;
1146 int noverlap1vertices;
1150 int noverlap2vertices;
1175 for(
int i = 0;
i < nbasevertices; ++
i )
1182 for(
int i = 0;
i < noverlap1vertices; ++
i )
1189 for(
int i = 0;
i < noverlap2vertices; ++
i )
1202 sepadata->nsepatwoflower += nseparated;
1293 int oldnsepaoneflower =
sepadata->nsepaoneflower;
1294#ifdef USE_OLD_ONEFLOWER_SEPARATION
1299 if(
sepadata->nsepaoneflower > oldnsepaoneflower )
1309 int oldnsepatwoflower =
sepadata->nsepatwoflower;
1310#ifdef USE_OLD_TWOFLOWER_SEPARATION
1315 if(
sepadata->nsepatwoflower > oldnsepatwoflower )
1467 "Whether to scan product expressions when constructing hypergraph", &
sepadata->scanproduct,
FALSE,
1470 "Maximum number of standard relaxation inequalities per cut round", &
sepadata->maxstandard,
FALSE,
1474 0, INT_MAX, 0, 0) );
1477 0, INT_MAX, 0, 0) );
1480 0, INT_MAX, 0, 0) );
1482 "Whether to only generate standard inequalities if also flowers were generated", &
sepadata->delaystandard,
1485 "Number of useless separation rounds after which we stop separating 1-flowers", &
sepadata->maxuselessoneflower,
1488 "Number of useless separation rounds after which we stop separating 2-flowers", &
sepadata->maxuselesstwoflower,
Constraint handler for AND constraints, .
constraint handler for nonlinear constraints specified by algebraic expressions
SCIP_VAR * SCIPgetResultantAnd(SCIP *scip, SCIP_CONS *cons)
int SCIPgetNVarsAnd(SCIP *scip, SCIP_CONS *cons)
SCIP_VAR * SCIPgetExprAuxVarNonlinear(SCIP_EXPR *expr)
SCIP_EXPR * SCIPgetExprNonlinear(SCIP_CONS *cons)
SCIP_VAR ** SCIPgetVarsAnd(SCIP *scip, SCIP_CONS *cons)
int SCIPgetSubscipDepth(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
void SCIPhashmapFree(SCIP_HASHMAP **hashmap)
int SCIPhashmapGetImageInt(SCIP_HASHMAP *hashmap, void *origin)
SCIP_RETCODE SCIPhashmapCreate(SCIP_HASHMAP **hashmap, BMS_BLKMEM *blkmem, int mapsize)
SCIP_RETCODE SCIPhashmapInsertInt(SCIP_HASHMAP *hashmap, void *origin, int image)
SCIP_MESSAGEHDLR * SCIPgetMessagehdlr(SCIP *scip)
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
SCIP_RETCODE SCIPaddPoolCut(SCIP *scip, SCIP_ROW *row)
SCIP_Bool SCIPisCutEfficacious(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *cut)
SCIP_Bool SCIPisEfficacious(SCIP *scip, SCIP_Real efficacy)
SCIP_RETCODE SCIPaddRow(SCIP *scip, SCIP_ROW *row, SCIP_Bool forcecut, SCIP_Bool *infeasible)
int SCIPexprGetNChildren(SCIP_EXPR *expr)
SCIP_Bool SCIPisExprProduct(SCIP *scip, SCIP_EXPR *expr)
SCIP_Bool SCIPexpriterIsEnd(SCIP_EXPRITER *iterator)
SCIP_Real SCIPgetCoefExprProduct(SCIP_EXPR *expr)
void SCIPexpriterSetStagesDFS(SCIP_EXPRITER *iterator, SCIP_EXPRITER_STAGE stopstages)
SCIP_EXPR * SCIPexpriterRestartDFS(SCIP_EXPRITER *iterator, SCIP_EXPR *expr)
SCIP_RETCODE SCIPcreateExpriter(SCIP *scip, SCIP_EXPRITER **iterator)
SCIP_EXPR * SCIPexpriterGetNext(SCIP_EXPRITER *iterator)
SCIP_EXPR ** SCIPexprGetChildren(SCIP_EXPR *expr)
void SCIPfreeExpriter(SCIP_EXPRITER **iterator)
SCIP_RETCODE SCIPexpriterInit(SCIP_EXPRITER *iterator, SCIP_EXPR *expr, SCIP_EXPRITER_TYPE type, SCIP_Bool allowrevisit)
SCIP_Real SCIPgetLPObjval(SCIP *scip)
#define SCIPallocCleanBufferArray(scip, ptr, num)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
BMS_BLKMEM * SCIPblkmem(SCIP *scip)
int SCIPcalcMemGrowSize(SCIP *scip, int num)
#define SCIPfreeCleanBuffer(scip, ptr)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPreallocBlockMemoryArray(scip, ptr, oldnum, newnum)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_RETCODE SCIPcacheRowExtensions(SCIP *scip, SCIP_ROW *row)
SCIP_RETCODE SCIPflushRowExtensions(SCIP *scip, SCIP_ROW *row)
SCIP_RETCODE SCIPaddVarToRow(SCIP *scip, SCIP_ROW *row, SCIP_VAR *var, SCIP_Real val)
SCIP_RETCODE SCIPreleaseRow(SCIP *scip, SCIP_ROW **row)
SCIP_RETCODE SCIPcreateEmptyRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_SEPA *sepa, const char *name, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
SCIP_RETCODE SCIPaddVarsToRow(SCIP *scip, SCIP_ROW *row, int nvars, SCIP_VAR **vars, SCIP_Real *vals)
SCIP_RETCODE SCIPcreateRowSepa(SCIP *scip, SCIP_ROW **row, SCIP_SEPA *sepa, const char *name, int len, SCIP_COL **cols, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool removable)
SCIP_RETCODE SCIPincludeSepaBasic(SCIP *scip, SCIP_SEPA **sepa, const char *name, const char *desc, int priority, int freq, SCIP_Real maxbounddist, SCIP_Bool usessubscip, SCIP_Bool delay, SCIP_DECL_SEPAEXECLP((*sepaexeclp)), SCIP_DECL_SEPAEXECSOL((*sepaexecsol)), SCIP_SEPADATA *sepadata)
SCIP_RETCODE SCIPsetSepaFree(SCIP *scip, SCIP_SEPA *sepa,)
const char * SCIPsepaGetName(SCIP_SEPA *sepa)
SCIP_RETCODE SCIPsetSepaInit(SCIP *scip, SCIP_SEPA *sepa,)
SCIP_RETCODE SCIPsetSepaExitsol(SCIP *scip, SCIP_SEPA *sepa,)
SCIP_SEPADATA * SCIPsepaGetData(SCIP_SEPA *sepa)
void SCIPsepaSetData(SCIP_SEPA *sepa, SCIP_SEPADATA *sepadata)
SCIP_RETCODE SCIPsetSepaCopy(SCIP *scip, SCIP_SEPA *sepa,)
SCIP_Real SCIPsolGetOrigObj(SCIP_SOL *sol)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
int SCIPgetNRuns(SCIP *scip)
SCIP_RETCODE SCIPcreateClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_RETCODE SCIPfreeClock(SCIP *scip, SCIP_CLOCK **clck)
SCIP_Real SCIPgetClockTime(SCIP *scip, SCIP_CLOCK *clck)
SCIP_RETCODE SCIPstartClock(SCIP *scip, SCIP_CLOCK *clck)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfeastol(SCIP *scip)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPgetDepth(SCIP *scip)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbGlobal(SCIP_VAR *var)
SCIP_RETCODE SCIPincludeSepaFlower(SCIP *scip)
int SCIPsnprintf(char *t, int len, const char *s,...)
assert(minobj< SCIPgetCutoffbound(scip))
void SCIPhypergraphIterStart(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_ITER *iterator, SCIP_HYPERGRAPH_EDGE base, unsigned int minoverlapsize, SCIP_Bool onlylater, SCIP_Bool findoverlaps)
initializes the iterator to the first adjacent edge of base
int SCIPhypergraphEdgesOverlapsBeyond(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_EDGE edge)
returns an index beyond the last overlap incident to edge
void SCIPhypergraphIterNext(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_ITER *iterator)
initializes the iterator to the first adjacent edge of base
SCIP_RETCODE SCIPhypergraphFree(SCIP_HYPERGRAPH **phypergraph)
frees a hypergraph
SCIP_RETCODE SCIPhypergraphAddEdge(SCIP_HYPERGRAPH *hypergraph, int nvertices, SCIP_HYPERGRAPH_VERTEX *vertices, SCIP_HYPERGRAPH_EDGE *pedge, SCIP_HYPERGRAPH_EDGEDATA **pedgedata)
adds a new edge to the hypergraph
void SCIPhypergraphIterClear(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_ITER *iterator)
frees a hypergraph iterator's internal memory
SCIP_Bool SCIPhypergraphIterValid(SCIP_HYPERGRAPH_ITER *iterator)
returns whether the iterator is valid
int SCIPhypergraphGetNEdges(SCIP_HYPERGRAPH *hypergraph)
returns the number of edges
SCIP_RETCODE SCIPhypergraphComputeVerticesEdges(SCIP_HYPERGRAPH *hypergraph)
computes each vertex' list of incident edges
SCIP_HYPERGRAPH_OVERLAPDATA * SCIPhypergraphOverlapData(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_OVERLAP overlap)
returns additional data of overlap
SCIP_RETCODE SCIPhypergraphAddVertex(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_VERTEX *pvertex, SCIP_HYPERGRAPH_VERTEXDATA **pvertexdata)
adds a new vertex to the hypergraph
int SCIPhypergraphEdgeSize(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_EDGE edge)
returns the number of vertices of edge
SCIP_Bool SCIPhypergraphOverlapsDisjoint(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_OVERLAP overlap1, SCIP_HYPERGRAPH_OVERLAP overlap2)
returns whether overlaps overlap1 and overlap2 are disjoint
SCIP_Bool SCIPhypergraphIsValid(SCIP_HYPERGRAPH *hypergraph, FILE *file)
asserts that the hypergraph data structures are valid
SCIP_HYPERGRAPH_VERTEX * SCIPhypergraphEdgeVertices(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_EDGE edge)
returns the array of vertices of edge
int SCIPhypergraphEdgesOverlapsFirst(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_EDGE edge)
returns an index for the first overlap incident to edge
SCIP_HYPERGRAPH_VERTEXDATA * SCIPhypergraphVertexData(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_VERTEX vertex)
returns additional data of vertex
SCIP_RETCODE SCIPhypergraphComputeOverlapsEdges(SCIP_HYPERGRAPH *hypergraph)
computes all overlaps' lists of incident edges
SCIP_RETCODE SCIPhypergraphComputeOverlaps(SCIP_HYPERGRAPH *hypergraph, SCIP_DECL_HYPERGRAPH_OVERLAP((*handler)), void *userdata)
computes all overlaps and stores overlaps' vertices and all edges' overlaps
int SCIPhypergraphGetNVertices(SCIP_HYPERGRAPH *hypergraph)
returns the number of vertices
SCIP_HYPERGRAPH_OVERLAP SCIPhypergraphEdgesOverlapsGetAtIndex(SCIP_HYPERGRAPH *hypergraph, int idx)
returns the overlap corresponding to idx that is incident to an edge
SCIP_RETCODE SCIPhypergraphIterInit(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_ITER *iterator)
initializes a hypergraph iterator's internal memory
SCIP_HYPERGRAPH_VERTEX * SCIPhypergraphOverlapVertices(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_OVERLAP overlap)
returns the array of sorted vertices of overlap
int SCIPhypergraphOverlapSize(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_OVERLAP overlap)
returns the number of vertices of overlap
int SCIPhypergraphGetNOverlaps(SCIP_HYPERGRAPH *hypergraph)
returns the number of overlaps
SCIP_HYPERGRAPH_EDGEDATA * SCIPhypergraphEdgeData(SCIP_HYPERGRAPH *hypergraph, SCIP_HYPERGRAPH_EDGE edge)
returns additional data of edge
SCIP_RETCODE SCIPhypergraphCreate(SCIP_HYPERGRAPH **phypergraph, BMS_BLKMEM *blkmem, int memvertices, int memedges, int memoverlaps, int memedgesvertices, size_t sizevertexdata, size_t sizeedgedata, size_t sizeoverlapdata)
creates a hypergraph
Internal methods for dealing with hypergraphs.
void SCIPmessagePrintInfo(SCIP_MESSAGEHDLR *messagehdlr, const char *formatstr,...)
#define SEPA_MAXBOUNDDIST
#define DEFAULT_MIN_OVERLAPS
static SCIP_RETCODE separateStandard(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, int maxnsepa, SCIP_RESULT *presult)
separate missing inequalities from the standard relaxation
static SCIP_RETCODE addCut(SCIP *scip, SCIP_SOL *sol, SCIP_ROW *row, int *pnumseparated, SCIP_RESULT *presult, SCIP_Bool *padded)
add a generated cut row to the cut pool (for the root node) or as a row (otherwise)
static SCIP_RETCODE separateTwoFlower(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, int maxnsepa, SCIP_RESULT *presult)
#define DEFAULT_SCAN_PRODUCT
#define DEFAULT_MAX_USELESS_TWOFLOWER
static SCIP_RETCODE separateOneFlower(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, int maxnsepa, SCIP_RESULT *presult)
#define DEFAULT_MAX_USELESS_ONEFLOWER
#define DEFAULT_DELAY_STANDARD
#define DEFAULT_MAX_ONEFLOWER
static SCIP_RETCODE separate(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol, SCIP_RESULT *result)
Main separation function.
static SCIP_RETCODE prepareSeparation(SCIP *scip, SCIP_SEPA *sepa, SCIP_SOL *sol)
#define DEFAULT_MAX_STANDARD
#define DEFAULT_MAX_TWOFLOWER
static SCIP_RETCODE constructHypergraph(SCIP *scip, SCIP_SEPADATA *sepadata)
constructs the hypergraph from transformed problem
flower-inequality separator
internal methods for global SCIP settings
SCIP_HYPERGRAPH_EDGE adjacent
SCIP_HYPERGRAPH_VERTEX * commonvertices
SCIP main data structure.
datastructures for global SCIP settings
struct SCIP_Clock SCIP_CLOCK
struct SCIP_Cons SCIP_CONS
struct SCIP_Conshdlr SCIP_CONSHDLR
struct SCIP_Expr SCIP_EXPR
struct SCIP_ExprIter SCIP_EXPRITER
#define SCIP_EXPRITER_ENTEREXPR
int SCIP_HYPERGRAPH_OVERLAP
struct SCIP_Hypergraph SCIP_HYPERGRAPH
struct SCIP_Hypergraph_Iter SCIP_HYPERGRAPH_ITER
struct SCIP_Hypergraph_OverlapData SCIP_HYPERGRAPH_OVERLAPDATA
struct SCIP_Hypergraph_NodeData SCIP_HYPERGRAPH_VERTEXDATA
int SCIP_HYPERGRAPH_VERTEX
struct SCIP_Hypergraph_EdgeData SCIP_HYPERGRAPH_EDGEDATA
struct SCIP_HashMap SCIP_HASHMAP
enum SCIP_Result SCIP_RESULT
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_SepaData SCIP_SEPADATA
#define SCIP_DECL_SEPAEXECSOL(x)
#define SCIP_DECL_SEPAEXECLP(x)
#define SCIP_DECL_SEPAFREE(x)
#define SCIP_DECL_SEPAEXITSOL(x)
struct SCIP_Sepa SCIP_SEPA
#define SCIP_DECL_SEPACOPY(x)
#define SCIP_DECL_SEPAINIT(x)
struct SCIP_Node SCIP_NODE