112 dejavu::static_graph* G,
134 assert( *internodeid >= 0 );
137 assert( *maxdegrees > 0 );
144 assert( commonnodeidx <= *internodeid );
153 curcolor = colors[0];
155 for (e = 1; e < nneighbors; ++e)
158 if ( colors[e] != curcolor )
163 (*degrees)[*internodeid] = 1;
164 ++(*degrees)[commonnodeidx];
166 for (f = curstart; f < e; ++f)
168 assert( neighbors[f] <= *internodeid );
169 ++(*degrees)[*internodeid];
170 ++(*degrees)[neighbors[f]];
175 (void) G->add_vertex(curcolor, (*degrees)[*internodeid]);
176 G->add_edge((
unsigned) commonnodeidx, (
unsigned) *internodeid);
178 for (f = curstart; f < e; ++f)
179 (*G).add_edge((
unsigned) neighbors[f], (
unsigned) *internodeid);
182 *naddededges += e - curstart + 1;
185 curcolor = colors[e];
195 (*degrees)[*internodeid] = 1;
196 ++(*degrees)[commonnodeidx];
198 for (f = curstart; f < nneighbors; ++f)
200 assert( neighbors[f] <= *internodeid );
201 ++(*degrees)[*internodeid];
202 ++(*degrees)[neighbors[f]];
207 (void) G->add_vertex(curcolor, (*degrees)[*internodeid]);
208 G->add_edge((
unsigned) commonnodeidx, (
unsigned) *internodeid);
210 for (f = curstart; f < nneighbors; ++f)
211 G->add_edge((
unsigned) neighbors[f], (
unsigned) *internodeid);
214 *naddededges += nneighbors - curstart + 1;
226 dejavu::static_graph* G,
237 int* groupfirsts =
NULL;
238 int* groupseconds =
NULL;
239 int* groupcolors =
NULL;
268 nvarnodestoadd = nsymvars;
272 nvarnodestoadd = 2 * nsymvars;
286 for (j = 0; j < *
nnodes; ++j)
294 for (j = 0; j < nvarnodestoadd; ++j)
304 groupByConstraints =
TRUE;
306 groupByConstraints =
FALSE;
325 first += nvarnodestoadd;
327 second = -second - 1;
329 second += nvarnodestoadd;
341 groupfirsts[ngroupedges] = first;
342 groupseconds[ngroupedges] = second;
346 groupfirsts[ngroupedges] = second;
347 groupseconds[ngroupedges] = first;
365 ++(*degrees)[second];
366 (*degrees)[internodeid] = 2;
377 (void) G->add_vertex(color, (*degrees)[internodeid]);
379 G->add_edge((
unsigned) first, (
unsigned) internodeid);
380 G->add_edge((
unsigned) second, (
unsigned) internodeid++);
388 ++(*degrees)[second];
394 if ( first < second )
395 G->add_edge((
unsigned) first, (
unsigned) second);
397 G->add_edge((
unsigned) second, (
unsigned) first);
404 if ( ngroupedges > 0 )
413 firstnodeidx = groupfirsts[0];
415 for (j = 1; j < ngroupedges; ++j)
418 if ( groupfirsts[j] != firstnodeidx )
421 nnodes, nedges, firstnodeidx, &groupseconds[firstidx], &groupcolors[firstidx], j - firstidx,
422 &naddednodes, &naddededges) );
425 firstnodeidx = groupfirsts[j];
430 *nedges += naddededges;
437 nnodes, nedges, firstnodeidx, &groupseconds[firstidx], &groupcolors[firstidx], ngroupedges - firstidx,
438 &naddednodes, &naddededges) );
443 *nedges += naddededges;
457 for (j = 0; j < nvarnodestoadd; ++j)
464 for (j = 0; j < nsymvars; ++j)
465 G->add_edge((
unsigned) j, (
unsigned) (j + nsymvars));
495 dejavu::static_graph* G,
508 int* nvarused1 =
NULL;
509 int* nvarused2 =
NULL;
510 int* varlabel =
NULL;
511 int* groupfirsts =
NULL;
512 int* groupseconds =
NULL;
513 int* groupcolors =
NULL;
553 nvarnodestoadd = nsymvars;
557 nvarnodestoadd = 2 * nsymvars;
565 for (e = 0; e < nsymedges; ++e)
570 nvarused1[-first - 1] += 1;
572 nvarused1[-second - 1] += 1;
577 nvarused2[-first - 1] += 1;
579 nvarused2[-second - 1] += 1;
582 for (j = 0; j < nvarnodestoadd; ++j)
585 if ( nvarused1[j] != nvarused2[j] )
596 varlabel[j] = nusedvars++;
615 groupByConstraints =
TRUE;
617 groupByConstraints =
FALSE;
626 for (
i = 0;
i < 2; ++
i)
629 graph =
i == 0 ? graph1 : graph2;
636 for (j = 0; j < nvarnodestoadd; ++j)
638 if ( varlabel[j] >= 0 )
641 (*degrees)[nodeshift + varlabel[j]] = 0;
651 (*degrees)[nodeshift + nusedvars + j] = 0;
661 for (j = 0; j < nvarnodestoadd; ++j)
663 if ( varlabel[j] >= 0 )
665 (void) G->add_vertex(j, (*degrees)[nodeshift + varlabel[j]]);
674 (*degrees)[nodeshift + nusedvars + j]);
680 internodeid = nodeshift + curnnodes;
681 for (e = 0; e < nsymedges; ++e)
688 first = varlabel[-first - 1];
690 first = nusedvars + first;
692 second = varlabel[-second - 1];
694 second = nusedvars + second;
704 groupfirsts[ngroupedges] = nodeshift + first;
705 groupseconds[ngroupedges] = nodeshift + second;
709 groupfirsts[ngroupedges] = nodeshift + second;
710 groupseconds[ngroupedges] = nodeshift + first;
727 ++(*degrees)[nodeshift + first];
728 ++(*degrees)[nodeshift + second];
729 (*degrees)[internodeid] = 2;
739 (void) G->add_vertex(nusedvars + color, (*degrees)[internodeid]);
740 G->add_edge((
unsigned) (nodeshift + first), (
unsigned) internodeid);
741 G->add_edge((
unsigned) (nodeshift + second), (
unsigned) internodeid);
750 ++(*degrees)[nodeshift + first];
751 ++(*degrees)[nodeshift + second];
758 if ( first < second )
759 G->add_edge((
unsigned) (nodeshift + first), (
unsigned) (nodeshift + second));
761 G->add_edge((
unsigned) (nodeshift + second), (
unsigned) (nodeshift + first));
768 if ( ngroupedges > 0 )
777 firstnodeidx = groupfirsts[0];
779 for (j = 1; j < ngroupedges; ++j)
782 if ( groupfirsts[j] != firstnodeidx )
785 nnodes, nedges, firstnodeidx, &groupseconds[firstidx], &groupcolors[firstidx], j - firstidx,
786 &naddednodes, &naddededges) );
789 firstnodeidx = groupfirsts[j];
794 *nedges += naddededges;
796 curnnodes += naddednodes;
802 nnodes, nedges, firstnodeidx, &groupseconds[firstidx], &groupcolors[firstidx], ngroupedges - firstidx,
803 &naddednodes, &naddededges) );
808 *nedges += naddededges;
810 curnnodes += naddednodes;
818 for (j = 0; j < nusedvars; ++j)
819 ++(*degrees)[nodeshift + j];
820 (*nedges) += nusedvars / 2;
826 for (j = 0; j < nusedvars/2; ++j)
827 G->add_edge((
unsigned) (nodeshift + j), (
unsigned) (nodeshift + j + nusedvars / 2));
830 nodeshift = curnnodes;
832 if (
i == 0 && nnodesfromG1 !=
NULL )
833 *nnodesfromG1 = curnnodes;
static SCIP_RETCODE addOrDetermineEffectOfGroupedEdges(SCIP *scip, dejavu::static_graph *G, SCIP_Bool determinesize, int *internodeid, int **degrees, int *maxdegrees, int *nnodes, int *nedges, int commonnodeidx, int *neighbors, int *colors, int nneighbors, int *naddednodes, int *naddededges)