/**************************************************************************
enum02 . c
Colin Ramsay ( cram @ itee . uq . edu . au )
25 Feb 00
ADVANCED COSET ENUMERATOR , Version 3 . 001
Copyright 2000
Centre for Discrete Mathematics and Computing ,
Department of Mathematics and
Department of Computer Science & Electrical Engineering ,
The University of Queensland , QLD 4072 .
( http : //staff.itee.uq.edu.au/havas)
To fully process all deductions properly we need to invoke the stack
clearing routine several times in _ rpefn ( ) . The following code allow us
to do this ; it ' s equivalent to the ` standard ' code , but the loops have been
unrolled & jumps removed . This allows multiple copies to be included
without problems , although we still have to be careful about the variable
names used . The ( local ) variables used are : irow , icol , ires , rcol , first ,
last , i , beg , end , ifront , iback , fwd , l , bwd , m , mi .
**************************************************************************/
while (topded >= 0 )
{
INCR(cddproc);
irow = dedrow[topded];
icol = dedcol[topded--];
if (COL1(irow) < 0 )
{
INCR(cdddedn);
continue ;
}
else
{
ires = CT(irow,icol);
rcol = invcol[icol];
}
if ((first = edpbeg[icol]) >= 0 )
{
last = edpend[icol];
for (i = first; i <= last; i += 2 )
{
beg = &(relators[edp[i]]);
end = beg + edp[i+1 ]-1 ;
ifront = l = ires;
iback = irow;
for (fwd = beg+1 ; fwd <= end; fwd++)
{
if ((l = CT(ifront, *fwd)) > 0 )
{ ifront = l; }
else
{ break ; }
}
if (l == 0 )
{
for (bwd = end; bwd >= fwd; bwd--)
{
m = *bwd;
mi = invcol[m];
if ((l = CT(iback, mi)) > 0 )
{ iback = l; }
else if (bwd == fwd)
{
CT(iback, mi) = ifront;
CT(ifront, m) = iback;
SAVED(iback, mi);
INCR(cddedn);
iback = ifront;
}
else
{
iback = ifront;
break ;
}
}
}
if (iback != ifront)
{
INCR(cdcoinc);
if ((l = al0_coinc(ifront,iback,TRUE )) > 0 )
{ return (l); }
if (COL1(irow) < 0 || COL1(ires) < 0 )
{ break ; }
}
}
}
if (COL1(irow) >= 0 && COL1(ires) >= 0 && (irow != ires || icol != rcol))
{
if ((first = edpbeg[rcol]) >= 0 )
{
last = edpend[rcol];
for (i = first; i <= last; i += 2 )
{
beg = &(relators[edp[i]]);
end = beg + edp[i+1 ]-1 ;
ifront = l = irow;
iback = ires;
for (fwd = beg+1 ; fwd <= end; fwd++)
{
if ((l = CT(ifront, *fwd)) > 0 )
{ ifront = l; }
else
{ break ; }
}
if (l == 0 )
{
for (bwd = end; bwd >= fwd; bwd--)
{
m = *bwd;
mi = invcol[m];
if ((l = CT(iback, mi)) > 0 )
{ iback = l; }
else if (bwd == fwd)
{
CT(iback, mi) = ifront;
CT(ifront, m) = iback;
SAVED(iback, mi);
INCR(cddedn);
iback = ifront;
}
else
{
iback = ifront;
break ;
}
}
}
if (iback != ifront)
{
INCR(cdcoinc);
if ((l = al0_coinc(ifront,iback,TRUE )) > 0 )
{ return (l); }
if (COL1(irow) < 0 || COL1(ires) < 0 )
{ break ; }
}
}
}
}
#ifdef AL0_DD
if (msgctrl && --msgnext == 0 )
{
msgnext = msgincr;
ETINT;
fprintf(fop, "DD: a=%d r=%d h=%d n=%d;" , nalive, knr, knh, nextdf);
MSGMID;
fprintf(fop, " d=%d\n" , topded+1 );
BTINT;
}
#endif
}
Messung V0.5 in Prozent C=99 H=90 G=94
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-09-02)
¤
*© Formatika GbR, Deutschland