36 #define EXT_ANCESTORS_MAX 16 38 #define RED_EXT_MAXDFSDEPTH 6 39 #define RED_EXT_MINDFSDEPTH 4 40 #define RED_EXT_MAXGRAD 8 41 #define RED_EXT_MINGRAD 6 42 #define RED_EXT_EDGELIMIT 50000 53 const int tail = graph->
tail[edge];
54 const int head = graph->
head[edge];
57 if( graph->
grad[tail] == 0 )
69 if( graph->
grad[head] == 0 )
95 const unsigned idx = ((unsigned) curr->index) / 2;
97 assert(curr->index >= 0 && idx < (
unsigned) (
MAX(graph->
edges, graph->
orgedges) / 2));
99 if( ancestormark[idx] )
102 ancestormark[idx] = 1;
121 assert(curr->index >= 0 && curr->index / 2 < (
MAX(graph->
edges, graph->
orgedges) / 2));
122 assert((ancestormark[((
unsigned) curr->index) / 2]) == 0);
124 ancestormark[((unsigned) curr->index) / 2] = 1;
141 assert(curr->index >= 0 && curr->index / 2 < (
MAX(graph->
edges, graph->
orgedges) / 2));
142 ancestormark[((unsigned) curr->index) / 2] = 0;
159 const unsigned idx = ((unsigned) curr->index) / 2;
161 assert(curr->index >= 0 && curr->index / 2 < (
MAX(graph->
edges, graph->
orgedges) / 2));
162 assert(ancestormark[idx] == 1);
164 ancestormark[idx] = 0;
173 const int* treeedges,
184 if( localbound > *globalbound )
185 *globalbound = localbound;
192 for(
int etree = 0; etree < dfsdepth; etree++ )
194 const int node = edgeends[treeedges[etree]];
195 assert(nodepos[node]);
202 assert(dfsdepth == 0);
220 assert(graph->
mark[currhead]);
222 if(
Is_term(graph->
term[currhead]) || graph->
grad[currhead] > maxgrad || dfsdepth >= maxdfsdepth )
225 if( root != currhead )
228 if( extendedcost < *minbound )
229 *minbound = extendedcost;
242 const int* treeedges,
249 unsigned int* nstallrounds
252 const int lastedge = treeedges[dfsdepth - 1];
254 assert(dfsdepth >= 1 && lastnode >= 0);
255 assert(
SCIPisGE(scip, treecostold, 0.0) && treecostoffset >= 0.0);
257 nodepos[lastnode] = 0;
261 if( (*nstallrounds)++ >= 9 )
267 for(
int i = 0; i < dfsdepth - 1; i++ )
268 treecost += redcost[treeedges[i]];
270 assert(
SCIPisEQ(scip, treecost, treecostold - redcost[lastedge]));
273 return (treecostold - redcost[lastedge]);
294 int n = nadded_edges + 1;
295 nodepos[currhead] = dfsdepth + 1;
296 *treecost += redcost[curredge];
297 treeedges[dfsdepth] = curredge;
298 treecosts[dfsdepth] = graph->
cost[curredge];
301 assert(graph->
mark[currhead]);
305 const int head = graph->
head[e];
306 if( !nodepos[head] && graph->
mark[head] )
330 int n = nadded_edges + 1;
331 nodepos[currtail] = dfsdepth + 1;
332 *treecost += redcost[curredge];
333 treeedges[dfsdepth] = curredge;
334 treecosts[dfsdepth] = graph->
cost[curredge];
337 assert(graph->
mark[currtail]);
341 const int tail = graph->
tail[e];
342 if( !nodepos[tail] && graph->
mark[tail] )
354 unsigned int* eqstack,
359 const unsigned int halfedge = ((
unsigned int) edge) / 2;
363 if( !eqmark[halfedge] )
365 eqmark[halfedge] =
TRUE;
366 eqstack[*eqstack_size] = halfedge;
368 *eqstack_size = *eqstack_size + 1;
381 const int* treeedges,
388 unsigned int* eqstack,
395 assert(!allow_eq ||(eqstack !=
NULL && eqstack_size !=
NULL && eqmark !=
NULL));
399 if(
SCIPisLE(scip, extedgecost, orgedgecost) )
401 if(
SCIPisEQ(scip, extedgecost, orgedgecost) )
407 else if(
SCIPisLT(scip, extedgecost, orgedgecost) )
410 if( nodepos[graph->
tail[extedge]] > graph->
knots )
412 start = nodepos[graph->
tail[extedge]] - 1 - graph->
knots;
413 assert(start >= 0 && start <= 3);
417 assert(basebottlenecks[start] > 0);
419 if(
SCIPisLT(scip, extedgecost, basebottlenecks[start]) )
426 start = nodepos[graph->
tail[extedge]];
427 assert(start >= 1 && start <= dfsdepth);
428 assert(start < dfsdepth || graph->tail[orgedge] == graph->
tail[extedge]);
432 for(
int i = start; i < dfsdepth; i++ )
434 assert(treecosts[i] >= 0.0);
438 if(
SCIPisLE(scip, extedgecost, treecosts[i]) )
440 if(
SCIPisEQ(scip, extedgecost, treecosts[i]) )
446 else if(
SCIPisLT(scip, extedgecost, treecosts[i]) )
461 const int* treeedges,
467 const int* ancestormark,
468 unsigned int* eqstack,
474 if( allowequality ? (extendedcost >= cutoff) :
SCIPisGT(scip, extendedcost, cutoff) )
484 if( ancestormark !=
NULL )
489 assert(curr->index >= 0 && curr->index / 2 < (
MAX(graph->
edges, graph->
orgedges) / 2));
490 if( ancestormark[((
unsigned) curr->index) / 2] )
495 currcost = graph->
cost[curredge];
496 currhead = graph->
head[curredge];
508 tail = graph->
tail[e];
509 ecost = graph->
cost[e];
514 assert(graph->
mark[tail]);
516 if(
bottleneckRuleOut(scip, graph, treecosts, basebottlenecks, nodepos, treeedges, currcost,
517 ecost, curredge, e, dfsdepth, allow_eq, eqstack, eqstack_size, eqmark) )
525 e2 = graph->
oeat[e2], count++ )
534 head2 = graph->
head[e2];
535 assert(head2 != tail);
540 const SCIP_Bool allow_eq = (eqmark !=
NULL && eqmark[((unsigned) e) / 2] ==
FALSE && eqmark[((unsigned) e2) / 2] ==
FALSE);
541 assert(graph->
mark[head2]);
543 if( pcmw && is_term )
544 extcost =
MAX(ecost + graph->
cost[e2] - graph->
prize[tail], extcost);
546 assert(head2 != currhead);
549 nodepos, treeedges, currcost, extcost, curredge,
flipedge(e2), dfsdepth, allow_eq, eqstack, eqstack_size, eqmark) )
576 unsigned int* eqstack,
581 const int head = graph->
head[edge];
582 const int tail = graph->
tail[edge];
584 SCIP_Real edgebound = redcost[edge] + pathdist[tail] + vnoi[head].
dist;
586 assert(scip !=
NULL);
587 assert(graph !=
NULL);
588 assert(redcost !=
NULL);
589 assert(pathdist !=
NULL);
590 assert(vnoi !=
NULL);
591 assert(edge >= 0 && edge < graph->edges);
595 for(
int k = 0; k < graph->
knots; k++ )
596 assert(graph->
mark[k] == (graph->
grad[k] > 0));
599 assert(graph->
mark[tail] && graph->
mark[head]);
605 if(
SCIPisGT(scip, edgebound, cutoff) || (equality &&
SCIPisEQ(scip, edgebound, cutoff)) || head == root )
624 basebottlenecks[0] = graph->
cost[edge];
626 basebottlenecks[1] = -1.0;
627 basebottlenecks[2] = -1.0;
641 const SCIP_Real treecostoffset = redcost[edge] + pathdist[tail];
644 unsigned int rounds = 0;
646 int nadded_edges = 0;
649 nodepos[tail] = nnodes + 1;
650 nodepos[head] = nnodes + 4;
654 const int head2 = graph->
head[e];
655 if( head2 != tail && graph->
mark[head2] )
656 edgestack[nadded_edges++] = e;
660 while( nadded_edges > 0 )
662 const int curredge = edgestack[--nadded_edges];
663 const int currhead = graph->
head[curredge];
665 assert(graph->
mark[currhead]);
668 if( nodepos[currhead] )
670 assert(dfsdepth >= 1 && treeedges[dfsdepth - 1] == curredge);
672 treecost =
shortenSubtree(scip, graph, redcost, treeedges, treecost, treecostoffset, dfsdepth,
673 currhead, nodepos, ancestormark, &rounds);
679 const SCIP_Real extendedcost = treecost + redcost[curredge] + vnoi[currhead].
dist;
681 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges, cutoff, extendedcost, dfsdepth, curredge, equality,
682 ancestormark, eqstack, eqstack_size, eqmark) )
685 if(
truncateSubtree(graph, extendedcost, root, currhead, maxgrad, dfsdepth, maxdfsdepth, &minbound, &stopped) )
688 if( stopped && minbound <= edgebound )
694 nadded_edges =
extendSubtreeHead(scip, graph, redcost, curredge, currhead, dfsdepth, nadded_edges, &treecost, treecosts, nodepos,
695 treeedges, edgestack, ancestormark);
700 assert(stopped || minbound ==
FARAWAY);
701 assert(
SCIPisGE(scip, minbound, redcost[edge] + pathdist[tail] + vnoi[head].dist));
703 finalizeSubtree(graph, graph->
head, treeedges, dfsdepth, stopped, minbound, &edgebound, deletable, nodepos, ancestormark);
707 if( !(*deletable) && !
Is_term(graph->
term[tail]) && graph->
grad[tail] <= maxgrad )
709 const SCIP_Real treecostoffset = edgebound - pathdist[tail];
713 int nadded_edges = 0;
714 unsigned int rounds = 0;
717 nodepos[head] = nnodes + 1;
718 nodepos[tail] = nnodes + 4;
722 const int tail2 = graph->
tail[e];
723 if( tail2 != head && graph->
mark[tail2] )
724 edgestack[nadded_edges++] = e;
728 while( nadded_edges > 0 )
730 const int curredge = edgestack[--nadded_edges];
731 const int currtail = graph->
tail[curredge];
732 assert(graph->
mark[currtail]);
735 if( nodepos[currtail] )
737 assert(dfsdepth >= 1 && treeedges[dfsdepth - 1] == curredge);
739 treecost =
shortenSubtree(scip, graph, redcost, treeedges, treecost, treecostoffset, dfsdepth,
740 currtail, nodepos, ancestormark, &rounds);
746 const SCIP_Real extendedcost = treecost + redcost[curredge] + pathdist[currtail];
748 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges, cutoff, extendedcost, dfsdepth,
flipedge(curredge), equality,
749 ancestormark, eqstack, eqstack_size, eqmark) )
752 if(
truncateSubtree(graph, extendedcost, -1, currtail, maxgrad, dfsdepth, maxdfsdepth, &minbound, &stopped) )
759 nadded_edges =
extendSubtreeTail(graph, redcost, curredge, currtail, dfsdepth, nadded_edges, &treecost, treecosts, nodepos, treeedges,
760 edgestack, ancestormark);
765 assert(stopped || minbound ==
FARAWAY);
766 assert(
SCIPisGE(scip, minbound, redcost[edge] + pathdist[tail] + vnoi[head].dist));
768 finalizeSubtree(graph, graph->
tail, treeedges, dfsdepth, stopped, minbound, &edgebound, deletable, nodepos, ancestormark);
777 for(
int i = 0; i <
nnodes; i++ )
778 assert(nodepos[i] == 0);
780 assert(ancestormark[i] == 0);
797 const int nedges = g->
edges;
807 for(
int e = 0; e < nancestors; e++ )
810 for(
int e = 0; e < nedges; e += 2 )
817 if( pcmw && g->
cost[e] != g->
cost[e + 1] )
855 unsigned int* eqstack,
862 const SCIP_Real orgtreebound = *treebound;
864 assert(scip !=
NULL);
865 assert(graph !=
NULL);
866 assert(redcost !=
NULL);
867 assert(ruleout !=
NULL);
868 assert(pathdist !=
NULL);
869 assert(vnoi !=
NULL);
870 assert(vbase !=
NULL);
871 assert(outedges !=
NULL);
872 assert(inedge >= 0 && outedges[0] >= 0 && outedges[1] >= 0);
873 assert(inedge < graph->edges && outedges[0] < graph->
edges && outedges[1] < graph->
edges);
878 if(
SCIPisGT(scip, *treebound, cutoff) )
887 const SCIP_Real basecost = redcost[inedge] + redcost[outedges[0]] + redcost[outedges[1]] + pathdist[graph->
tail[inedge]];
891 const int innode = graph->
tail[inedge];
892 const int basenode = graph->
head[inedge];
896 assert(basenode == graph->
tail[outedges[0]] && basenode == graph->
tail[outedges[1]]);
902 nodepos[basenode] = nnodes + 1;
903 nodepos[innode] = nnodes + 2;
924 for(
int i = 0; i < 2 && !(*ruleout); i++ )
928 const int startedge = outedges[i];
929 const int costartedge = outedges[(i + 1) % 2];
930 const int startnode = graph->
head[startedge];
931 const int costartnode = graph->
head[costartedge];
933 int nadded_edges = 0;
935 unsigned int rounds = 0;
939 assert(startnode != root && costartnode != root);
942 basebottlenecks[0] = graph->
cost[startedge];
945 basebottlenecks[1] =
MAX(graph->
cost[startedge], graph->
cost[inedge]);
948 basebottlenecks[2] =
MAX(graph->
cost[startedge], graph->
cost[costartedge]);
950 nodepos[costartnode] = nnodes + 3;
951 nodepos[startnode] = nnodes + 4;
954 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges,
FARAWAY, 0.0, 0, startedge,
FALSE,
962 if(
Is_term(graph->
term[startnode]) || graph->
grad[startnode] > maxgrad )
965 assert(nodepos[startnode]);
968 if( !nodepos[graph->
head[e]] )
969 edgestack[nadded_edges++] = e;
972 while ( nadded_edges > 0 )
974 const int curredge = edgestack[--nadded_edges];
975 const int currhead = graph->
head[curredge];
978 if( nodepos[currhead] )
980 assert(dfsdepth >= 1 && treeedges[dfsdepth - 1] == curredge);
982 treecost =
shortenSubtree(scip, graph, redcost, treeedges, treecost, basecost, dfsdepth,
983 currhead, nodepos, ancestormark, &rounds);
989 SCIP_Real extendedcost = treecost + redcost[curredge];
991 if( vbase[costartnode] == vbase[currhead] )
997 assert(vbase[costartnode + nnodes] >= 0 || costartfar ==
FARAWAY);
998 assert(vbase[currhead + nnodes] >= 0 || currentfar ==
FARAWAY);
999 extendedcost += MIN(costartfar + vnoi[currhead].dist, vnoi[costartnode].dist + currentfar);
1002 extendedcost += vnoi[costartnode].
dist + vnoi[currhead].
dist;
1005 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges, cutoff, extendedcost, dfsdepth, curredge,
FALSE,
1006 ancestormark, eqstack, eqstack_size, eqmark) )
1010 if(
truncateSubtree(graph, extendedcost, root, currhead, maxgrad, dfsdepth, maxdfsdepth, &minbound, &stopped) )
1012 if( stopped && minbound <= (*treebound) )
1018 nadded_edges =
extendSubtreeHead(scip, graph, redcost, curredge, currhead, dfsdepth, nadded_edges, &treecost, treecosts, nodepos,
1019 treeedges, edgestack, ancestormark);
1024 assert(stopped || minbound ==
FARAWAY);
1026 assert(
SCIPisGE(scip, minbound, orgtreebound));
1029 finalizeSubtree(graph, graph->
head, treeedges, dfsdepth, stopped, minbound, treebound, ruleout, nodepos, ancestormark);
1033 assert(*treebound >= orgtreebound);
1036 if( !(*ruleout) && !
Is_term(graph->
term[innode]) && graph->
grad[innode] <= maxgrad )
1039 const SCIP_Real treecostoffset = *treebound - pathdist[innode];
1043 int nadded_edges = 0;
1045 unsigned int rounds = 0;
1047 assert(treecost >= 0.0);
1048 assert(nodepos[innode] == nnodes + 2);
1049 assert(nodepos[basenode] == nnodes + 1);
1051 nodepos[graph->
head[outedges[0]]] = nnodes + 2;
1052 nodepos[graph->
head[outedges[1]]] = nnodes + 3;
1053 nodepos[innode] = nnodes + 4;
1056 basebottlenecks[0] = graph->
cost[inedge];
1059 basebottlenecks[1] =
MAX(graph->
cost[outedges[0]], graph->
cost[inedge]);
1062 basebottlenecks[2] =
MAX(graph->
cost[outedges[1]], graph->
cost[inedge]);
1065 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges,
FARAWAY, 0.0, 0,
flipedge(inedge),
FALSE,
1073 if( !nodepos[graph->
tail[e]] )
1074 edgestack[nadded_edges++] = e;
1078 while( nadded_edges > 0 )
1080 const int curredge = edgestack[--nadded_edges];
1081 const int currtail = graph->
tail[curredge];
1084 if( nodepos[currtail] )
1086 assert(dfsdepth >= 1 && treeedges[dfsdepth - 1] == curredge);
1088 treecost =
shortenSubtree(scip, graph, redcost, treeedges, treecost, treecostoffset, dfsdepth,
1089 currtail, nodepos, ancestormark, &rounds);
1095 const SCIP_Real extendedcost = treecost + redcost[curredge] + pathdist[currtail];
1097 if(
ruleOutSubtree(scip, graph, treecosts, basebottlenecks, nodepos, treeedges, cutoff, extendedcost, dfsdepth,
flipedge((
unsigned)curredge),
FALSE,
1098 ancestormark, eqstack, eqstack_size, eqmark) )
1101 if(
truncateSubtree(graph, extendedcost, -1, currtail, maxgrad, dfsdepth, maxdfsdepth, &minbound, &stopped) )
1103 if( stopped && minbound <= (*treebound) )
1109 nadded_edges =
extendSubtreeTail(graph, redcost, curredge, currtail, dfsdepth, nadded_edges, &treecost, treecosts, nodepos,
1110 treeedges, edgestack, ancestormark);
1116 assert(stopped || minbound ==
FARAWAY);
1117 assert(
SCIPisGE(scip, minbound, orgtreebound));
1120 finalizeSubtree(graph, graph->
tail, treeedges, dfsdepth, stopped, minbound, treebound, ruleout, nodepos, ancestormark);
1124 nodepos[basenode] = 0;
1125 nodepos[innode] = 0;
1129 for(
int i = 0; i < 2; i++ )
1131 nodepos[graph->
head[outedges[i]]] = 0;
1136 assert(*treebound >= orgtreebound);
1138 for(
int i = 0; i <
nnodes; i++ )
1139 assert(nodepos[i] == 0);
1142 assert(ancestormark[i] == 0);
1169 unsigned int* eqstack;
1172 const int nedges = graph->
edges;
1174 const int halfnedges = graph->
edges / 2;
1177 assert(marked !=
NULL);
1188 for(
int k = 0; k <
nnodes; k++ )
1189 graph->
mark[k] = (graph->
grad[k] > 0);
1192 for(
int e = 0; e < nedges; e += 2 )
1194 const int erev = e + 1;
1201 int eqstack_size = 0;
1212 SCIP_CALL_ABORT(
reduceCheckEdge(scip, graph, root, cost, pathdist, vnoi, minpathcost, e, allowequality, nodearr,
1213 &deletable, eqstack, &eqstack_size, eqmark));
1219 if( !marked[erev] && (deletable || markdirected) )
1223 nodearr, &erevdeletable, eqstack, &eqstack_size, eqmark));
1226 marked[erev] =
TRUE;
1228 deletable = (deletable && erevdeletable);
1231 for(
int i = 0; i < eqstack_size; i++ )
1232 eqmark[eqstack[i]] =
FALSE;
1234 for(
int i = 0; i < halfnedges; i++ )
1235 assert(eqmark[i] ==
FALSE);
1251 for(
int k = 0; k <
nnodes; k++ )
1252 if( graph->
grad[k] == 0 && k != root )
static SCIP_Bool ruleOutSubtree(SCIP *scip, const GRAPH *graph, const SCIP_Real *treecosts, const SCIP_Real *basebottlenecks, const int *nodepos, const int *treeedges, SCIP_Real cutoff, SCIP_Real extendedcost, int dfsdepth, int curredge, SCIP_Bool allowequality, const int *ancestormark, unsigned int *eqstack, int *eqstack_size, SCIP_Bool *eqmark)
static SCIP_Bool markAncestorsConflict(const GRAPH *graph, int edge, int *ancestormark)
SCIP_RETCODE reduce_extendedCheck3Tree(SCIP *scip, const GRAPH *graph, int root, const SCIP_Real *redcost, const SCIP_Real *pathdist, const PATH *vnoi, const int *vbase, SCIP_Real cutoff, const int *outedges, int inedge, SCIP_Real *treebound, SCIP_Bool *ruleout, unsigned int *eqstack, int *eqstack_size, SCIP_Bool *eqmark)
void graph_edge_del(SCIP *, GRAPH *, int, SCIP_Bool)
static SCIP_Bool bottleneckRuleOut(SCIP *scip, const GRAPH *graph, const SCIP_Real *treecosts, const SCIP_Real *basebottlenecks, const int *nodepos, const int *treeedges, SCIP_Real orgedgecost, SCIP_Real extedgecost, int orgedge, int extedge, int dfsdepth, SCIP_Bool allow_eq, unsigned int *eqstack, int *eqstack_size, SCIP_Bool *eqmark)
static void removeEdge(SCIP *scip, int edge, GRAPH *graph)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
static int extendSubtreeTail(const GRAPH *graph, const SCIP_Real *redcost, int curredge, int currtail, int dfsdepth, int nadded_edges, SCIP_Real *treecost, SCIP_Real *treecosts, int *nodepos, int *treeedges, int *edgestack, int *ancestormark)
#define EXT_ANCESTORS_MAX
enum SCIP_Retcode SCIP_RETCODE
includes various files containing graph methods used for Steiner tree problems
static void unmarkAncestorsConflict(const GRAPH *graph, int edge, int *ancestormark)
SCIP_Bool SCIPisEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
#define SCIPfreeBufferArray(scip, ptr)
static SCIP_RETCODE reduceCheckEdge(SCIP *scip, const GRAPH *graph, int root, const SCIP_Real *redcost, const SCIP_Real *pathdist, const PATH *vnoi, SCIP_Real cutoff, int edge, SCIP_Bool equality, int *edgestack, SCIP_Bool *deletable, unsigned int *eqstack, int *eqstack_size, SCIP_Bool *eqmark)
#define SCIPallocCleanBufferArray(scip, ptr, num)
SCIP_RETCODE reduce_deleteConflictEdges(SCIP *scip, GRAPH *g)
static void markAncestors(const GRAPH *graph, int edge, int *ancestormark)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
#define RED_EXT_EDGELIMIT
int reduce_extendedEdge(SCIP *scip, GRAPH *graph, const PATH *vnoi, const SCIP_Real *cost, const SCIP_Real *pathdist, const int *result, SCIP_Real minpathcost, int root, STP_Bool *marked, SCIP_Bool markdirected)
#define SCIPallocBufferArray(scip, ptr, num)
static int extendSubtreeHead(SCIP *scip, const GRAPH *graph, const SCIP_Real *redcost, int curredge, int currhead, int dfsdepth, int nadded_edges, SCIP_Real *treecost, SCIP_Real *treecosts, int *nodepos, int *treeedges, int *edgestack, int *ancestormark)
static SCIP_Bool truncateSubtree(const GRAPH *graph, SCIP_Real extendedcost, int root, int currhead, int maxgrad, int dfsdepth, int maxdfsdepth, SCIP_Real *minbound, SCIP_Bool *stopped)
#define RED_EXT_MAXDFSDEPTH
static SCIP_Real shortenSubtree(SCIP *scip, const GRAPH *graph, const SCIP_Real *redcost, const int *treeedges, SCIP_Real treecostold, SCIP_Real treecostoffset, int dfsdepth, int lastnode, int *nodepos, int *ancestormark, unsigned int *nstallrounds)
SCIP_Bool SCIPisGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
static void updateEqArrays(int edge, unsigned int *eqstack, int *eqstack_size, SCIP_Bool *eqmark)
#define RED_EXT_MINDFSDEPTH
SCIP_Bool graph_pc_isPcMw(const GRAPH *)
static void finalizeSubtree(const GRAPH *graph, const int *edgeends, const int *treeedges, int dfsdepth, SCIP_Bool stopped, SCIP_Real localbound, SCIP_Real *globalbound, SCIP_Bool *ruleout, int *nodepos, int *ancestormark)
#define SCIPfreeCleanBufferArray(scip, ptr)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
#define SCIP_CALL_ABORT(x)
static void unmarkAncestors(const GRAPH *graph, int edge, int *ancestormark)
includes various reduction methods for Steiner tree problems
IDX * graph_edge_getAncestors(const GRAPH *, int)