#define USAGE "genquarticg [-ugs -h -c -l] n [res/mod] [file]"
#define HELPTEXT \ " generate all non-isomorphic quartic graphs of a given order \n\
\n\
n : the number of the vertices\n\
file : the name of the output file (default stdout)\n\
-u : donot output any graphs, just generate and count them\n\
-g : use graph6 format for output (default)\n\
-s : use sparse6 format for output\n\
-h write a header (only with -g or -s). \n\
-c : only write connected graphs\n\
-C : only write biconnected graphs\n\
res/mod : only generate subset res out of subsets 0..mod-1\n\
-l : canonically label output graphs.\n"
static FILE *outfile; /* file for output graphs */ staticchar *outfilename;
boolean nooutput; /* presence of -u */
boolean graph6; /* presence of -g */
boolean sparse6; /* presence of -s */
boolean header; /* presence of -h */ staticint connec; /* 1 for -c, 2 for -C, 0 for neither */
boolean connec1; /* presence of -c */
boolean connec2; /* presence of -C */
boolean canonise; /* presence of -l */ //????????
typedefstruct
{ int first; int sec;
setword fn;
setword sn;
setword end; int intersect; int cond;
} edgestruct;
typedefstruct
{ int first; int sec; int multp;
} pairstruct;
typedefstruct
{ int base; int first1; int sec1; int first2; int sec2;
} dovistruct;
typedefenum
{ accept,reject,undef } CHOISE;
int *pCNT, *pnumpair, *pdoviorbit, *pepairorbit; int (*pantidovi)[MAXN], (*pantipair)[MAXE], (*pantiedge)[MAXN]; int count[MAXN]; long numread;
nauty_counter numwritten;
pairstruct *pepair;
dovistruct *pdovi;
edgestruct *pedge;
setword active;
boolean goodret; staticint nmax, m, code, numcells, mod, res, splitlevel, splitcount; //TMP static splitlevel,splitcount,mod,res; ??????TMP? staticvoid extend(int, graph *, edgestruct *, pairstruct *, int, int * , int *, setword *, int *, boolean ); staticint init_refinex( int *, int *, int *, set *, int); staticvoid refinex( graph *, int *, int *, int , int *, int *, set *, boolean , int *, int , int ); staticvoid userautom1(int,int*,int*,int,int,int); staticvoid userautom2(int,int*,int*,int,int,int); staticvoid userautom3(int,int*,int*,int,int,int);
static boolean
isbiconnected(graph *g, int n) /* test if g is biconnected */
{ int sp,v,w;
setword sw;
setword visited; int numvis,num[MAXN],lp[MAXN],stack[MAXN];
staticvoid
userautom1(int count, int *perm, int *orbits, int numorbits, int stabvertex, int n)
{ int epairperm[MAXP]; int vn1, vn2, vn3, vn4, etmp, i, e1, e2;
epairperm[0] = 0; for (i = 1; i < *pnumpair; i++)
{
e1 = pepair[i].first;
e2 = pepair[i].sec;
/***************************************************************************** ** *userautom2(count,perm,orbits,numorbits,stabvertex,n)isasimple* *versionoftheprocedurenamedbyoptions.userautomproc.* **
*****************************************************************************/ staticvoid
userautom2(int count, int *perm, int *orbits, int numorbits, int stabvertex, int n)
{ int doviperm[3*MAXN]; int vn1, vn2, vn3, vn4, vnb, i, etmp;
for (i = 0; i < *pCNT; i++)
{
vnb = perm[pdovi[i].base];
vn1 = perm[pdovi[i].first1];
vn2 = perm[pdovi[i].sec1];
vn3 = perm[pdovi[i].first2];
vn4 = perm[pdovi[i].sec2];
/***************************************************************************** ** *userautom3(count,perm,orbits,numorbits,stabvertex,n)isasimple* *versionoftheprocedurenamedbyoptions.userautomproc.* **
*****************************************************************************/ staticvoid
userautom3( int count, int *perm, int *orbits, int numorbits, int stabvertex, int n)
{
int doviperm[3*MAXN], epairperm[MAXP]; int vn1, vn2, vn3, vn4, vnb, i, etmp, e1, e2;
for (i = 0; i < *pCNT; i++)
{
vnb = perm[pdovi[i].base];
vn1 = perm[pdovi[i].first1];
vn2 = perm[pdovi[i].sec1];
vn3 = perm[pdovi[i].first2];
vn4 = perm[pdovi[i].sec2];
staticint
init_refinex( int *clr, int *lb, int *p, set *active, int n)
{ registerint i, j, ci, ncell;
ncell = 1;
*active = bit[0]; for (i = 0; i < n; i++)
{
ci = clr[i]; for (j = i-1; (j >= 0) && (clr[lb[j]] > ci) ; j--)
lb[j+1] = lb[j];
lb[j+1] = i;
}
lb[n] = n; for (i = 0; i < n; i++)
{ if( clr[lb[i]] != clr[lb[i+1]] )
{
p[i] = 0;
ncell++;
*active |= bit[i+1];
} else
p[i] = 1;
}
p[n] = 0; return ncell;
}
/***************************************************************************** ** *refinex(g,lab,ptn,level,numcells,count,active,goodret,code,m,n)isa* *customversionofrefine()whichcanexitquicklyifrequired.* ** *Onlyuseatlevel==0.* *goodret:whethertodoanearlyreturnforcode1* *code:=-1forn-1notmax,0formaybe,1fordefinite* **
*****************************************************************************/ staticvoid
refinex(graph *g, int *lab, int *ptn, int level, int *numcells, int *count,
set *active, boolean goodret, int *code, int m, int n)
{ int i, c1, c2, labc1, split1, split2, cell1, cell2, cnt, bmin, bmax; int workperm[MAXN], bucket[MAXN+2];
setword x, lact, workset;
set *gptr;
if (n == 1)
{
*code = 1; return;
}
*code = 0;
lact = *active;
split1 = -1; while (*numcells < n && lact)
{
TAKEBIT(split1,lact);
for (split2 = split1; ptn[split2] > 0; ++split2) {} if (split1 == split2) /* trivial splitting cell */
{
gptr = GRAPHROW(g,lab[split1],1); for (cell1 = 0; cell1 < n; cell1 = cell2 + 1)
{ for (cell2 = cell1; ptn[cell2] > 0; ++cell2) {} if (cell1 == cell2) continue;
if (!argnum )
badargs = TRUE; elseif (nmax < 1 || nmax > MAXN )
{
fprintf(stderr, ">E quarticgen: must have n =1..%d \n",MAXN);
badargs = TRUE;
}
if (!gotmr)
{
mod = 1;
res = 0;
} /* else if (argnum == 5 || argnum > 6)
badargs = TRUE;*/// argnum will never exceeds 1 here andeven in genbg it never exceeds 2!
if (badargs)
{
fprintf(stderr,">E Usage: %s\n",USAGE);
GETHELP; exit(1);
}
if ( (graph6!=0) + (sparse6!=0) + (nooutput!=0) > 1)
gt_abort(">E quarticgen: -ugs are incompatible\n");
if ( nooutput && header)
gt_abort(">E quarticgen: -u -h are incompatible\n");
if (!quiet)
{
msg[0] = '\0'; if (strlen(argv[0]) > 75) fprintf(stderr,">A %s",argv[0]); else CATMSG1(">A %s",argv[0]);
CATMSG1(" n = %d", nmax); // if (connec) CATMSG0(connec2 ? "C" : connec1 ? "c" : "",); if (connec2) CATMSG0(" C"); elseif (connec1) CATMSG0(" c"); if (mod > 1) CATMSG2(" class= %d/%d", res, mod);
CATMSG0("\n");
fputs(msg,stderr);
fflush(stderr);
}
if (header)
{ if (SPARSE6)
writeline(outfile,SPARSE6_HEADER); // No enter after the header is ok? else
writeline(outfile,GRAPH6_HEADER);
fflush(outfile);
}
// if (mod > 1 && nmax > 10) if( mod > 1 )
{ if( nmax <= threshold )
splitlevel = nmax - LEV1; else
splitlevel = LEV2;
splitcount = res;
} else
{
splitlevel = -1;
mod = 1;
res = 0; // narjess for the sake of n>splitlevel (below)
}
timebefore = CPUTIME;
m = 1;
cntr = numread = numwritten = 0; for(cntr = 0; cntr < NUMIRRED; cntr++)
{
n = graphsize(irred[cntr]); ////////////////////////////////////////////////////////////////// if( n == splitlevel )
{ if (splitcount-- != 0) continue; if( n == nmax )
splitcount = mod-1; else
splitcount = 0;
} if( n > splitlevel )
{ if ( gotmr && res ) continue;
} /////////////////////////////////////////////////////////////////////////
if( n < nmax )
{
numread++;
stringtograph(irred[cntr],g,m);
epairorbit[0] = 0;
numpair = 1;
numedge = 0; for (i = 0; i < n; i++)
{
multar[i] = 10;
x = g[i] & BITMASK(i); while (x)
{
TAKEBIT(j,x);
edge[numedge].first = i;
edge[numedge].sec = j;
antiedge[i][j] = numedge;
numedge++;
if (!quiet)
{ if (nooutput)
fprintf(stderr,">Z " COUNTER_FMT " graphs generated in %3.2f seconds\n",
numwritten,timeafter-timebefore); else
fprintf(stderr,">Z " COUNTER_FMT " graphs written to %s in %3.2f seconds\n",
numwritten,outfilename,timeafter-timebefore);
}
exit(0);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.35 Sekunden
(vorverarbeitet am 2026-06-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.