// Merge two cycles as per Karp
private static GlobalObject merge(GlobalObject ga, GlobalObject gb,
GlobalObject gt, int nproc)
{
Tree min, next, prev, tmp;
GlobalObject gmin, gnext, gprev, gtmp;
Tree a, b, t;
double mindist, test, mintonext, mintoprev, ttonext, ttoprev;
Tree n1, p1, n2, p2;
GlobalObject gn1, gp1, gn2, gp2;
double tton1, ttop1, tton2, ttop2;
double n1ton2, n1top2, p1ton2, p1top2;
int choice;
int i;
/* Compute location for first cycle */
gmin = ga;
a = (Tree) ga.open("r");
t = (Tree) gt.open("w");
mindist = distance(t, a);
gtmp = ga;
ga = a._next;
try {
gtmp.release(); /* release ga from above */
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
for (; !ga.equals(gtmp); ) {
GlobalObject oldga;
a = (Tree) ga.open("r");
test = distance(a, t);
if (test < mindist) {
mindist = test;
gmin = ga;
} /* if */
oldga = ga;
ga = a._next;
try {
oldga.release();
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
} /* for ga... */
min = (Tree) gmin.open("w");
gnext = min._next;
gprev = min._prev;
next = (Tree) gnext.open("w");
prev = (Tree) gprev.open("w");
mintonext = distance(min, next);
mintoprev = distance(min, prev);
ttonext = distance(t, next);
ttoprev = distance(t, prev);
if ((ttoprev - mintoprev) < (ttonext - mintonext)) {
/* would insert between min and prev */
gp1 = gprev;
p1 = prev;
gn1 = gmin;
n1 = min;
tton1 = mindist;
ttop1 = ttoprev;
try {
gnext.release();
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
}
else { /* would insert between min and next */
gp1 = gmin;
p1 = min;
gn1 = gnext;
n1 = next;
ttop1 = mindist;
tton1 = ttonext;
try {
gprev.release();
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
}
/* At this point, I am holding gt,gn1,gp1 in write mode */
/* Compute location for second cycle */
gmin = gb;
b = (Tree) gb.open("r");
mindist = distance(t, b);
gtmp = gb;
gb = b._next;
try {
gtmp.release(); /* gb from above */
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
for (; !gb.equals(gtmp); ) {
GlobalObject oldgb;
b = (Tree) gb.open("r");
test = distance(b, t);
if (test < mindist) {
mindist = test;
gmin = gb;
} /* if */
oldgb = gb;
gb = b._next;
try {
oldgb.release();
} catch (AlephException ale) {
Aleph.warning("Release failed: " + ale.getMessage());
}
} /* for tmp... */