/*2:*/
#line 32 "gb_basic.w"
#include "gb_graph.h"
#define panic(c) \
{panic_code= c; \
gb_free(working_storage) ; \
gb_trouble_code= 0; \
return NULL; \
} \
#define BUF_SIZE 4096 \
#define MAX_D 91 \
#define MAX_NNN 1000000000.0 \
#define UL_BITS 8*sizeof(unsigned long) \
#define vert_offset(v,delta) ((Vertex*) (((siz_t) v) +delta) ) \
\
#define tmp u.V \
#define tlen z.A \
#define mult v.I
#define minlen w.I \
#define map z.V \
#define ind z.I \
#define IND_GRAPH 1000000000
#define subst y.G \
#line 34 "gb_basic.w"
/*3:*/
#line 42 "gb_basic.w"
static Area working_storage;
/*:3*//*5:*/
#line 68 "gb_basic.w"
static char buffer[BUF_SIZE];
/*:5*//*10:*/
#line 226 "gb_basic.w"
static long nn[MAX_D+1];
static long wr[MAX_D+1];
static long del[MAX_D+1];
static long sig[MAX_D+2];
static long xx[MAX_D+1],yy[MAX_D+1];
/*:10*//*51:*/
#line 1036 "gb_basic.w"
#line 99 "gb_basic.ch"
static char*short_imap=
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"_^~&@,;.:?!%#$+-*/|<=>()[]{}`'";
#line 1039 "gb_basic.w"
/*:51*/
#line 35 "gb_basic.w"
/*8:*/
#line 175 "gb_basic.w"
#line 50 "gb_basic.ch"
Graph*board(
long n1,long n2,long n3,long n4,
long piece,
long wrap,
long directed)
#line 181 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 181 "gb_basic.w"
long n;
long p;
long l;
/*11:*/
#line 233 "gb_basic.w"
if(piece==0)piece= 1;
if(n1<=0){n1= n2= 8;n3= 0;}
nn[1]= n1;
if(n2<=0){k= 2;d= -n2;n3= n4= 0;}
else{
nn[2]= n2;
if(n3<=0){k= 3;d= -n3;n4= 0;}
else{
nn[3]= n3;
if(n4<=0){k= 4;d= -n4;}
else{nn[4]= n4;d= 4;goto done;}
}
}
if(d==0){d= k-1;goto done;}
/*12:*/
#line 255 "gb_basic.w"
if(d> MAX_D)panic(bad_specs);
for(j= 1;k<=d;j++,k++)nn[k]= nn[j];
/*:12*/
#line 248 "gb_basic.w"
;
done:
/*:11*/
#line 185 "gb_basic.w"
;
/*13:*/
#line 265 "gb_basic.w"
{float nnn;
for(n= 1,nnn= 1.0,j= 1;j<=d;j++){
nnn*= (float)nn[j];
if(nnn> MAX_NNN)panic(very_bad_specs);
n*= nn[j];
}
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"board(%ld,%ld,%ld,%ld,%ld,%ld,%d)",
n1,n2,n3,n4,piece,wrap,directed?1:0);
strcpy(new_graph->util_types,"ZZZIIIZZZZZZZZ");
/*14:*/
#line 294 "gb_basic.w"
{register char*q;
nn[0]= xx[0]= xx[1]= xx[2]= xx[3]= 0;
for(k= 4;k<=d;k++)xx[k]= 0;
for(v= new_graph->vertices;;v++){
q= buffer;
for(k= 1;k<=d;k++){
sprintf(q,".%ld",xx[k]);
while(*q)q++;
}
v->name= gb_save_string(&buffer[1]);
v->x.I= xx[1];v->y.I= xx[2];v->z.I= xx[3];
for(k= d;xx[k]+1==nn[k];k--)xx[k]= 0;
if(k==0)break;
xx[k]++;
}
}
/*:14*/
#line 278 "gb_basic.w"
;
}
/*:13*/
#line 186 "gb_basic.w"
;
/*15:*/
#line 322 "gb_basic.w"
/*16:*/
#line 341 "gb_basic.w"
{register long w= wrap;
for(k= 1;k<=d;k++,w>>= 1){
wr[k]= w&1;
del[k]= sig[k]= 0;
}
sig[0]= del[0]= sig[d+1]= 0;
}
/*:16*/
#line 323 "gb_basic.w"
;
p= piece;
if(p<0)p= -p;
while(1){
/*17:*/
#line 353 "gb_basic.w"
for(k= d;sig[k]+(del[k]+1)*(del[k]+1)> p;k--)del[k]= 0;
if(k==0)break;
del[k]++;
sig[k+1]= sig[k]+del[k]*del[k];
for(k++;k<=d;k++)sig[k+1]= sig[k];
if(sig[d+1]
vertices;;v++){
/*20:*/
#line 388 "gb_basic.w"
for(k= 1;k<=d;k++)yy[k]= xx[k]+del[k];
for(l= 1;;l++){
/*22:*/
#line 406 "gb_basic.w"
for(k= 1;k<=d;k++){
if(yy[k]<0){
if(!wr[k])goto no_more;
do yy[k]+= nn[k];while(yy[k]<0);
}else if(yy[k]>=nn[k]){
if(!wr[k])goto no_more;
do yy[k]-= nn[k];while(yy[k]>=nn[k]);
}
}
/*:22*/
#line 391 "gb_basic.w"
;
if(piece<0)/*21:*/
#line 399 "gb_basic.w"
{
for(k= 1;k<=d;k++)if(yy[k]!=xx[k])goto unequal;
goto no_more;
unequal:;
}
/*:21*/
#line 392 "gb_basic.w"
;
/*23:*/
#line 417 "gb_basic.w"
for(k= 2,j= yy[1];k<=d;k++)j= nn[k]*j+yy[k];
if(directed)gb_new_arc(v,new_graph->vertices+j,l);
else gb_new_edge(v,new_graph->vertices+j,l);
/*:23*/
#line 393 "gb_basic.w"
;
if(piece> 0)goto no_more;
for(k= 1;k<=d;k++)yy[k]+= del[k];
}
no_more:
/*:20*/
#line 372 "gb_basic.w"
;
for(k= d;xx[k]+1==nn[k];k--)xx[k]= 0;
if(k==0)break;
xx[k]++;
}
/*:19*/
#line 329 "gb_basic.w"
;
/*18:*/
#line 362 "gb_basic.w"
for(k= d;del[k]<=0;k--)del[k]= -del[k];
if(sig[k]==0)break;
del[k]= -del[k];
/*:18*/
#line 331 "gb_basic.w"
;
}
}
/*:15*/
#line 187 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:8*//*26:*/
#line 492 "gb_basic.w"
#line 63 "gb_basic.ch"
Graph*simplex(
unsigned long n,
long n0,long n1,long n2,long n3,long n4,
long directed)
#line 497 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 497 "gb_basic.w"
/*27:*/
#line 508 "gb_basic.w"
if(n0==0)n0= -2;
if(n0<0){k= 2;nn[0]= n;d= -n0;n1= n2= n3= n4= 0;}
else{
if(n0> n)n0= n;
nn[0]= n0;
if(n1<=0){k= 2;d= -n1;n2= n3= n4= 0;}
else{
if(n1> n)n1= n;
nn[1]= n1;
if(n2<=0){k= 3;d= -n2;n3= n4= 0;}
else{
if(n2> n)n2= n;
nn[2]= n2;
if(n3<=0){k= 4;d= -n3;n4= 0;}
else{
if(n3> n)n3= n;
nn[3]= n3;
if(n4<=0){k= 5;d= -n4;}
else{if(n4> n)n4= n;
nn[4]= n4;d= 4;goto done;}
}
}
}
}
if(d==0){d= k-2;goto done;}
nn[k-1]= nn[0];
/*12:*/
#line 255 "gb_basic.w"
if(d> MAX_D)panic(bad_specs);
for(j= 1;k<=d;j++,k++)nn[k]= nn[j];
/*:12*/
#line 535 "gb_basic.w"
;
done:
/*:27*/
#line 498 "gb_basic.w"
;
/*28:*/
#line 538 "gb_basic.w"
/*29:*/
#line 549 "gb_basic.w"
{long nverts;
register long*coef= gb_typed_alloc(n+1,long,working_storage);
if(gb_trouble_code)panic(no_room+1);
for(k= 0;k<=nn[0];k++)coef[k]= 1;
for(j= 1;j<=d;j++)
/*30:*/
#line 571 "gb_basic.w"
{
for(k= n,i= n-nn[j]-1;i>=0;k--,i--)coef[k]-= coef[i];
s= 1;
for(k= 1;k<=n;k++){
s+= coef[k];
if(s> 1000000000)panic(very_bad_specs);
coef[k]= s;
}
}
/*:30*/
#line 556 "gb_basic.w"
;
nverts= coef[n];
gb_free(working_storage);
new_graph= gb_new_graph(nverts);
if(new_graph==NULL)
panic(no_room);
}
/*:29*/
#line 540 "gb_basic.w"
;
sprintf(new_graph->id,"simplex(%lu,%ld,%ld,%ld,%ld,%ld,%d)",
n,n0,n1,n2,n3,n4,directed?1:0);
strcpy(new_graph->util_types,"VVZIIIZZZZZZZZ");
/*:28*/
#line 499 "gb_basic.w"
;
/*31:*/
#line 599 "gb_basic.w"
v= new_graph->vertices;
yy[d+1]= 0;sig[0]= n;
for(k= d;k>=0;k--)yy[k]= yy[k+1]+nn[k];
if(yy[0]>=n){
k= 0;xx[0]= (yy[1]>=n?0:n-yy[1]);
while(1){
/*32:*/
#line 619 "gb_basic.w"
for(s= sig[k]-xx[k],k++;k<=d;s-= xx[k],k++){
sig[k]= s;
if(s<=yy[k+1])xx[k]= 0;
else xx[k]= s-yy[k+1];
}
if(s!=0)panic(impossible+1)
/*:32*/
#line 606 "gb_basic.w"
;
/*34:*/
#line 646 "gb_basic.w"
{register char*p= buffer;
for(k= 0;k<=d;k++){
sprintf(p,".%ld",xx[k]);
while(*p)p++;
}
v->name= gb_save_string(&buffer[1]);
v->x.I= xx[0];v->y.I= xx[1];v->z.I= xx[2];
}
/*:34*/
#line 607 "gb_basic.w"
;
hash_in(v);
/*35:*/
#line 661 "gb_basic.w"
for(j= 0;jvertices+new_graph->n)
panic(impossible);
/*:31*/
#line 500 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:26*//*37:*/
#line 731 "gb_basic.w"
#line 76 "gb_basic.ch"
Graph*subsets(
unsigned long n,
long n0,long n1,long n2,long n3,long n4,
unsigned long size_bits,
long directed)
#line 737 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 737 "gb_basic.w"
/*27:*/
#line 508 "gb_basic.w"
if(n0==0)n0= -2;
if(n0<0){k= 2;nn[0]= n;d= -n0;n1= n2= n3= n4= 0;}
else{
if(n0> n)n0= n;
nn[0]= n0;
if(n1<=0){k= 2;d= -n1;n2= n3= n4= 0;}
else{
if(n1> n)n1= n;
nn[1]= n1;
if(n2<=0){k= 3;d= -n2;n3= n4= 0;}
else{
if(n2> n)n2= n;
nn[2]= n2;
if(n3<=0){k= 4;d= -n3;n4= 0;}
else{
if(n3> n)n3= n;
nn[3]= n3;
if(n4<=0){k= 5;d= -n4;}
else{if(n4> n)n4= n;
nn[4]= n4;d= 4;goto done;}
}
}
}
}
if(d==0){d= k-2;goto done;}
nn[k-1]= nn[0];
/*12:*/
#line 255 "gb_basic.w"
if(d> MAX_D)panic(bad_specs);
for(j= 1;k<=d;j++,k++)nn[k]= nn[j];
/*:12*/
#line 535 "gb_basic.w"
;
done:
/*:27*/
#line 738 "gb_basic.w"
;
/*38:*/
#line 748 "gb_basic.w"
/*29:*/
#line 549 "gb_basic.w"
{long nverts;
register long*coef= gb_typed_alloc(n+1,long,working_storage);
if(gb_trouble_code)panic(no_room+1);
for(k= 0;k<=nn[0];k++)coef[k]= 1;
for(j= 1;j<=d;j++)
/*30:*/
#line 571 "gb_basic.w"
{
for(k= n,i= n-nn[j]-1;i>=0;k--,i--)coef[k]-= coef[i];
s= 1;
for(k= 1;k<=n;k++){
s+= coef[k];
if(s> 1000000000)panic(very_bad_specs);
coef[k]= s;
}
}
/*:30*/
#line 556 "gb_basic.w"
;
nverts= coef[n];
gb_free(working_storage);
new_graph= gb_new_graph(nverts);
if(new_graph==NULL)
panic(no_room);
}
/*:29*/
#line 750 "gb_basic.w"
;
sprintf(new_graph->id,"subsets(%lu,%ld,%ld,%ld,%ld,%ld,0x%lx,%d)",
n,n0,n1,n2,n3,n4,size_bits,directed?1:0);
strcpy(new_graph->util_types,"ZZZIIIZZZZZZZZ");
/*:38*/
#line 739 "gb_basic.w"
;
/*39:*/
#line 758 "gb_basic.w"
v= new_graph->vertices;
yy[d+1]= 0;sig[0]= n;
for(k= d;k>=0;k--)yy[k]= yy[k+1]+nn[k];
if(yy[0]>=n){
k= 0;xx[0]= (yy[1]>=n?0:n-yy[1]);
while(1){
/*32:*/
#line 619 "gb_basic.w"
for(s= sig[k]-xx[k],k++;k<=d;s-= xx[k],k++){
sig[k]= s;
if(s<=yy[k+1])xx[k]= 0;
else xx[k]= s-yy[k+1];
}
if(s!=0)panic(impossible+1)
/*:32*/
#line 765 "gb_basic.w"
;
/*34:*/
#line 646 "gb_basic.w"
{register char*p= buffer;
for(k= 0;k<=d;k++){
sprintf(p,".%ld",xx[k]);
while(*p)p++;
}
v->name= gb_save_string(&buffer[1]);
v->x.I= xx[0];v->y.I= xx[1];v->z.I= xx[2];
}
/*:34*/
#line 766 "gb_basic.w"
;
/*40:*/
#line 786 "gb_basic.w"
{register Vertex*u;
for(u= new_graph->vertices;u<=v;u++){register char*p= u->name;
long ss= 0;
for(j= 0;j<=d;j++,p++){
for(s= (*p++)-'0';*p>='0';p++)s= 10*s+*p-'0';
if(xx[j]vertices+new_graph->n)
panic(impossible);
/*:39*/
#line 740 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:37*//*43:*/
#line 885 "gb_basic.w"
#line 89 "gb_basic.ch"
Graph*perms(
long n0,long n1,long n2,long n3,long n4,
unsigned long max_inv,
long directed)
#line 890 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 890 "gb_basic.w"
register long n;
/*44:*/
#line 902 "gb_basic.w"
if(n0==0){n0= 1;n1= 0;}
else if(n0<0){n1= n0;n0= 1;}
n= BUF_SIZE;
/*27:*/
#line 508 "gb_basic.w"
if(n0==0)n0= -2;
if(n0<0){k= 2;nn[0]= n;d= -n0;n1= n2= n3= n4= 0;}
else{
if(n0> n)n0= n;
nn[0]= n0;
if(n1<=0){k= 2;d= -n1;n2= n3= n4= 0;}
else{
if(n1> n)n1= n;
nn[1]= n1;
if(n2<=0){k= 3;d= -n2;n3= n4= 0;}
else{
if(n2> n)n2= n;
nn[2]= n2;
if(n3<=0){k= 4;d= -n3;n4= 0;}
else{
if(n3> n)n3= n;
nn[3]= n3;
if(n4<=0){k= 5;d= -n4;}
else{if(n4> n)n4= n;
nn[4]= n4;d= 4;goto done;}
}
}
}
}
if(d==0){d= k-2;goto done;}
nn[k-1]= nn[0];
/*12:*/
#line 255 "gb_basic.w"
if(d> MAX_D)panic(bad_specs);
for(j= 1;k<=d;j++,k++)nn[k]= nn[j];
/*:12*/
#line 535 "gb_basic.w"
;
done:
/*:27*/
#line 906 "gb_basic.w"
;
/*45:*/
#line 913 "gb_basic.w"
{register long ss;
for(k= 0,s= ss= 0;k<=d;ss+= s*nn[k],s+= nn[k],k++)
if(nn[k]>=BUF_SIZE)panic(bad_specs);
if(s>=BUF_SIZE)panic(bad_specs+1);
n= s;
if(max_inv==0||max_inv> ss)max_inv= ss;
}
/*:45*/
#line 907 "gb_basic.w"
;
/*:44*/
#line 892 "gb_basic.w"
;
/*46:*/
#line 931 "gb_basic.w"
{long nverts;
register long*coef= gb_typed_alloc(max_inv+1,long,working_storage);
if(gb_trouble_code)panic(no_room+1);
coef[0]= 1;
for(j= 1,s= nn[0];j<=d;s+= nn[j],j++)
/*47:*/
#line 957 "gb_basic.w"
for(k= 1;k<=nn[j];k++){register long ii;
for(i= max_inv,ii= i-k-s;ii>=0;ii--,i--)coef[i]-= coef[ii];
for(i= k,ii= 0;i<=max_inv;i++,ii++){
coef[i]+= coef[ii];
if(coef[i]> 1000000000)panic(very_bad_specs+1);
}
}
/*:47*/
#line 938 "gb_basic.w"
;
for(k= 1,nverts= 1;k<=max_inv;k++){
nverts+= coef[k];
if(nverts> 1000000000)panic(very_bad_specs);
}
gb_free(working_storage);
new_graph= gb_new_graph(nverts);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"perms(%ld,%ld,%ld,%ld,%ld,%lu,%d)",
n0,n1,n2,n3,n4,max_inv,directed?1:0);
strcpy(new_graph->util_types,"VVZZZZZZZZZZZZ");
}
/*:46*/
#line 893 "gb_basic.w"
;
/*48:*/
#line 979 "gb_basic.w"
{register long*xtab,*ytab,*ztab;
long m= 0;
/*49:*/
#line 995 "gb_basic.w"
xtab= gb_typed_alloc(3*n+3,long,working_storage);
if(gb_trouble_code){
gb_recycle(new_graph);panic(no_room+2);}
ytab= xtab+(n+1);
ztab= ytab+(n+1);
for(j= 0,k= 1,s= nn[0];;k++){
xtab[k]= ztab[k]= j;
if(k==s){
if(++j> d)break;
else s+= nn[j];
}
}
/*:49*/
#line 982 "gb_basic.w"
;
v= new_graph->vertices;
while(1){
/*52:*/
#line 1040 "gb_basic.w"
{register char*p;register long*q;
for(p= &buffer[n-1],q= &xtab[n];q> xtab;p--,q--)*p= short_imap[*q];
v->name= gb_save_string(buffer);
hash_in(v);
}
/*:52*/
#line 985 "gb_basic.w"
;
/*53:*/
#line 1053 "gb_basic.w"
for(j= 1;j xtab[j+1]){register Vertex*u;
buffer[j-1]= short_imap[xtab[j+1]];buffer[j]= short_imap[xtab[j]];
u= hash_out(buffer);
if(u==NULL)panic(impossible+2);
if(directed)gb_new_arc(u,v,1L);
else gb_new_edge(u,v,1L);
buffer[j-1]= short_imap[xtab[j]];buffer[j]= short_imap[xtab[j+1]];
}
/*:53*/
#line 986 "gb_basic.w"
;
v++;
/*50:*/
#line 1014 "gb_basic.w"
for(k= n;k;k--){
if(m ztab[k-1])goto move;
if(ytab[k]){
for(j= k-ytab[k];jvertices+new_graph->n)
panic(impossible);
gb_free(working_storage);
}
/*:48*/
#line 894 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:43*//*55:*/
#line 1097 "gb_basic.w"
#line 113 "gb_basic.ch"
Graph*parts(
unsigned long n,
unsigned long max_parts,
unsigned long max_size,
long directed)
#line 1103 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1103 "gb_basic.w"
if(max_parts==0||max_parts> n)max_parts= n;
if(max_size==0||max_size> n)max_size= n;
if(max_parts> MAX_D)panic(bad_specs);
/*56:*/
#line 1121 "gb_basic.w"
{long nverts;
register long*coef= gb_typed_alloc(n+1,long,working_storage);
if(gb_trouble_code)panic(no_room+1);
coef[0]= 1;
for(k= 1;k<=max_parts;k++){
for(j= n,i= n-k-max_size;i>=0;i--,j--)coef[j]-= coef[i];
for(j= k,i= 0;j<=n;i++,j++){
coef[j]+= coef[i];
if(coef[j]> 1000000000)panic(very_bad_specs);
}
}
nverts= coef[n];
gb_free(working_storage);
new_graph= gb_new_graph(nverts);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"parts(%lu,%lu,%lu,%d)",
n,max_parts,max_size,directed?1:0);
strcpy(new_graph->util_types,"VVZZZZZZZZZZZZ");
}
/*:56*/
#line 1107 "gb_basic.w"
;
/*57:*/
#line 1151 "gb_basic.w"
v= new_graph->vertices;
xx[0]= max_size;sig[1]= n;
for(k= max_parts,s= 1;k> 0;k--,s++)yy[k]= s;
if(max_size*max_parts>=n){
k= 1;xx[1]= (n-1)/max_parts+1;
while(1){
/*58:*/
#line 1169 "gb_basic.w"
for(s= sig[k]-xx[k],k++;s;k++){
sig[k]= s;
xx[k]= (s-1)/yy[k]+1;
s-= xx[k];
}
d= k-1;
/*:58*/
#line 1158 "gb_basic.w"
;
/*60:*/
#line 1188 "gb_basic.w"
{register char*p= buffer;
for(k= 1;k<=d;k++){
sprintf(p,"+%ld",xx[k]);
while(*p)p++;
}
v->name= gb_save_string(&buffer[1]);
hash_in(v);
}
/*:60*/
#line 1159 "gb_basic.w"
;
/*61:*/
#line 1205 "gb_basic.w"
if(d a;k++)nn[k-1]= xx[k];
nn[k-1]= a;
for(;xx[k]> b;k++)nn[k]= xx[k];
nn[k]= b;
for(;k<=d;k++)nn[k+1]= xx[k];
for(k= 1;k<=d+1;k++){
sprintf(p,"+%ld",nn[k]);
while(*p)p++;
}
u= hash_out(&buffer[1]);
if(u==NULL)panic(impossible+2);
if(directed)gb_new_arc(v,u,1L);
else gb_new_edge(v,u,1L);
}
/*:62*/
#line 1213 "gb_basic.w"
;
}
nn[j]= xx[j];
}
}
/*:61*/
#line 1160 "gb_basic.w"
;
v++;
/*59:*/
#line 1180 "gb_basic.w"
if(d==1)goto last;
for(k= d-1;;k--){
if(xx[k]vertices+new_graph->n)
panic(impossible);
/*:57*/
#line 1108 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:55*//*64:*/
#line 1289 "gb_basic.w"
#line 126 "gb_basic.ch"
Graph*binary(
unsigned long n,
unsigned long max_height,
long directed)
#line 1294 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1294 "gb_basic.w"
if(2*n+2> BUF_SIZE)panic(bad_specs);
if(max_height==0||max_height> n)max_height= n;
if(max_height> 30)panic(very_bad_specs);
/*65:*/
#line 1322 "gb_basic.w"
{long nverts;
if(n>=20&&max_height>=6)/*66:*/
#line 1347 "gb_basic.w"
{register float ss;
d= (1L< 8)panic(bad_specs+1);
if(d<0)nverts= 0;
else{
nn[0]= nn[1]= 1;
for(k= 2;k<=d;k++)nn[k]= 0;
for(j= 2;j<=max_height;j++){
for(k= d;k;k--){
for(ss= 0.0,i= k;i>=0;i--)ss+= ((float)nn[i])*((float)nn[k-i]);
if(ss> MAX_NNN)panic(very_bad_specs+1);
for(s= 0,i= k;i>=0;i--)s+= nn[i]*nn[k-i];
nn[k]= s;
}
i= (1L<=0;i--)s+= nn[i]*nn[k-i];
nn[k+1]= s;
}
nverts= nn[n];
}
new_graph= gb_new_graph(nverts);
if(new_graph==NULL)
panic(no_room);
sprintf(new_graph->id,"binary(%lu,%lu,%d)",
n,max_height,directed?1:0);
strcpy(new_graph->util_types,"VVZZZZZZZZZZZZ");
}
/*:65*/
#line 1298 "gb_basic.w"
;
/*67:*/
#line 1408 "gb_basic.w"
{register long*xtab,*ytab,*ltab,*stab;
/*68:*/
#line 1428 "gb_basic.w"
xtab= gb_typed_alloc(8*n+4,long,working_storage);
if(gb_trouble_code){
gb_recycle(new_graph);panic(no_room+2);}
d= n+n;
ytab= xtab+(d+1);
ltab= ytab+(d+1);
stab= ltab+(d+1);
ltab[0]= 1L<vertices;
if(ltab[0]> n){
k= 0;xtab[0]= n?1:0;
while(1){
/*69:*/
#line 1439 "gb_basic.w"
for(j= k+1;j<=d;j++){
if(xtab[j-1]){
ltab[j]= ltab[j-1]>>1;
ytab[j]= ytab[j-1]+ltab[j];
stab[j]= stab[j-1];
}else{
ytab[j]= ytab[j-1]&(ytab[j-1]-1);
ltab[j]= ytab[j-1]-ytab[j];
stab[j]= stab[j-1]-1;
}
if(stab[j]<=ytab[j])xtab[j]= 0;
else xtab[j]= 1;
}
/*:69*/
#line 1415 "gb_basic.w"
;
/*71:*/
#line 1476 "gb_basic.w"
{register char*p= buffer;
for(k= 0;k<=d;k++,p++)*p= (xtab[k]?'.':'x');
v->name= gb_save_string(buffer);
hash_in(v);
}
/*:71*/
#line 1416 "gb_basic.w"
;
/*72:*/
#line 1492 "gb_basic.w"
for(j= 0;j=0;s+= (xtab[i+1]<<1)-1,i++)xtab[i]= xtab[i+1];
xtab[i]= 1;
{register char*p= buffer;
register Vertex*u;
for(k= 0;k<=d;k++,p++)*p= (xtab[k]?'.':'x');
u= hash_out(buffer);
if(u){
if(directed)gb_new_arc(v,u,1L);
else gb_new_edge(v,u,1L);
}
}
for(i--;i> j;i--)xtab[i+1]= xtab[i];
xtab[i+1]= 1;
}
/*:72*/
#line 1417 "gb_basic.w"
;
v++;
/*70:*/
#line 1458 "gb_basic.w"
for(k= d-1;;k--){
if(k<=0)goto last;
if(xtab[k])break;
}
for(k--;;k--){
if(xtab[k]==0&<ab[k]> 1)break;
if(k==0)goto last;
}
xtab[k]++;
/*:70*/
#line 1420 "gb_basic.w"
;
}
}
}
last:if(v!=new_graph->vertices+new_graph->n)
panic(impossible);
gb_free(working_storage);
/*:67*/
#line 1299 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:64*//*74:*/
#line 1544 "gb_basic.w"
#line 139 "gb_basic.ch"
Graph*complement(
Graph*g,
long copy,
long self,
long directed)
#line 1550 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1550 "gb_basic.w"
register long n;
register Vertex*u;
register siz_t delta;
if(g==NULL)panic(missing_operand);
/*75:*/
#line 1575 "gb_basic.w"
n= g->n;
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
delta= ((siz_t)(new_graph->vertices))-((siz_t)(g->vertices));
for(u= new_graph->vertices,v= g->vertices;vvertices+n;u++,v++)
u->name= gb_save_string(v->name);
/*:75*/
#line 1555 "gb_basic.w"
;
sprintf(buffer,",%d,%d,%d)",copy?1:0,self?1:0,directed?1:0);
make_compound_id(new_graph,"complement(",g,buffer);
/*76:*/
#line 1590 "gb_basic.w"
for(v= g->vertices;vvertices+n;v++){register Vertex*vv;
u= vert_offset(v,delta);
{register Arc*a;
for(a= v->arcs;a;a= a->next)vert_offset(a->tip,delta)->tmp= u;
}
if(directed){
for(vv= new_graph->vertices;vvvertices+n;vv++)
if((vv->tmp==u&©)||(vv->tmp!=u&&!copy))
if(vv!=u||self)gb_new_arc(u,vv,1L);
}else{
for(vv= (self?u:u+1);vvvertices+n;vv++)
if((vv->tmp==u&©)||(vv->tmp!=u&&!copy))
gb_new_edge(u,vv,1L);
}
}
for(v= new_graph->vertices;vvertices+n;v++)v->tmp= NULL;
/*:76*/
#line 1558 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:74*//*78:*/
#line 1641 "gb_basic.w"
#line 152 "gb_basic.ch"
Graph*gunion(
Graph*g,Graph*gg,
long multi,
long directed)
#line 1646 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1646 "gb_basic.w"
register long n;
register Vertex*u;
register siz_t delta,ddelta;
if(g==NULL||gg==NULL)panic(missing_operand);
/*75:*/
#line 1575 "gb_basic.w"
n= g->n;
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
delta= ((siz_t)(new_graph->vertices))-((siz_t)(g->vertices));
for(u= new_graph->vertices,v= g->vertices;vvertices+n;u++,v++)
u->name= gb_save_string(v->name);
/*:75*/
#line 1652 "gb_basic.w"
;
sprintf(buffer,",%d,%d)",multi?1:0,directed?1:0);
make_double_compound_id(new_graph,"gunion(",g,",",gg,buffer);
ddelta= ((siz_t)(new_graph->vertices))-
((siz_t)(gg->vertices));
/*79:*/
#line 1665 "gb_basic.w"
for(v= g->vertices;vvertices+n;v++){
register Arc*a;
register Vertex*vv= vert_offset(v,delta);
register Vertex*vvv= vert_offset(vv,-ddelta);
for(a= v->arcs;a;a= a->next){
u= vert_offset(a->tip,delta);
/*80:*/
#line 1700 "gb_basic.w"
{register Arc*b;
if(directed){
if(multi||u->tmp!=vv)gb_new_arc(vv,u,a->len);
else{
b= u->tlen;
if(a->lenlen)b->len= a->len;
}
u->tmp= vv;
u->tlen= vv->arcs;
}else if(u>=vv){
if(multi||u->tmp!=vv)gb_new_edge(vv,u,a->len);
else{
b= u->tlen;
if(a->lenlen)b->len= (b+1)->len= a->len;
}
u->tmp= vv;
u->tlen= vv->arcs;
if(u==vv&&a->next==a+1)a++;
}
}
/*:80*/
#line 1674 "gb_basic.w"
;
}
if(vvvvertices+gg->n)for(a= vvv->arcs;a;a= a->next){
u= vert_offset(a->tip,ddelta);
if(uvertices+n)
/*80:*/
#line 1700 "gb_basic.w"
{register Arc*b;
if(directed){
if(multi||u->tmp!=vv)gb_new_arc(vv,u,a->len);
else{
b= u->tlen;
if(a->lenlen)b->len= a->len;
}
u->tmp= vv;
u->tlen= vv->arcs;
}else if(u>=vv){
if(multi||u->tmp!=vv)gb_new_edge(vv,u,a->len);
else{
b= u->tlen;
if(a->lenlen)b->len= (b+1)->len= a->len;
}
u->tmp= vv;
u->tlen= vv->arcs;
if(u==vv&&a->next==a+1)a++;
}
}
/*:80*/
#line 1679 "gb_basic.w"
;
}
}
for(v= new_graph->vertices;vvertices+n;v++)
v->tmp= NULL,v->tlen= NULL;
/*:79*/
#line 1657 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:78*//*81:*/
#line 1722 "gb_basic.w"
#line 164 "gb_basic.ch"
Graph*intersection(
Graph*g,Graph*gg,
long multi,
long directed)
#line 1727 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1727 "gb_basic.w"
register long n;
register Vertex*u;
register siz_t delta,ddelta;
if(g==NULL||gg==NULL)panic(missing_operand);
/*75:*/
#line 1575 "gb_basic.w"
n= g->n;
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
delta= ((siz_t)(new_graph->vertices))-((siz_t)(g->vertices));
for(u= new_graph->vertices,v= g->vertices;vvertices+n;u++,v++)
u->name= gb_save_string(v->name);
/*:75*/
#line 1732 "gb_basic.w"
;
sprintf(buffer,",%d,%d)",multi?1:0,directed?1:0);
make_double_compound_id(new_graph,"intersection(",g,",",gg,buffer);
ddelta= ((siz_t)(new_graph->vertices))-
((siz_t)(gg->vertices));
/*82:*/
#line 1750 "gb_basic.w"
for(v= g->vertices;vvertices+n;v++){register Arc*a;
register Vertex*vv= vert_offset(v,delta);
register Vertex*vvv= vert_offset(vv,-ddelta);
if(vvv>=gg->vertices+gg->n)continue;
/*85:*/
#line 1796 "gb_basic.w"
for(a= v->arcs;a;a= a->next){
u= vert_offset(a->tip,delta);
if(u->tmp==vv){
u->mult++;
if(a->lenminlen)u->minlen= a->len;
}else u->tmp= vv,u->mult= 0,u->minlen= a->len;
if(u==vv&&!directed&&a->next==a+1)a++;
}
/*:85*/
#line 1757 "gb_basic.w"
;
for(a= vvv->arcs;a;a= a->next){
u= vert_offset(a->tip,ddelta);
if(u>=new_graph->vertices+n)continue;
if(u->tmp==vv){long l= u->minlen;
if(a->len> l)l= a->len;
if(u->mult<0)/*84:*/
#line 1788 "gb_basic.w"
{register Arc*b= u->tlen;
if(llen){
b->len= l;
if(!directed)(b+1)->len= l;
}
}
/*:84*/
#line 1763 "gb_basic.w"
else/*83:*/
#line 1771 "gb_basic.w"
{
if(directed)gb_new_arc(vv,u,l);
else{
if(vv<=u)gb_new_edge(vv,u,l);
if(vv==u&&a->next==a+1)a++;
}
if(!multi){
u->tlen= vv->arcs;
u->mult= -1;
}else if(u->mult==0)u->tmp= NULL;
else u->mult--;
}
/*:83*/
#line 1765 "gb_basic.w"
;
}
}
}
/*86:*/
#line 1807 "gb_basic.w"
for(v= new_graph->vertices;vvertices+n;v++){
v->tmp= NULL;
v->tlen= NULL;
v->mult= 0;
v->minlen= 0;
}
/*:86*/
#line 1769 "gb_basic.w"
;
/*:82*/
#line 1737 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:81*//*87:*/
#line 1835 "gb_basic.w"
#line 175 "gb_basic.ch"
Graph*lines(
Graph*g,
long directed)
#line 1839 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 1839 "gb_basic.w"
register long m;
register Vertex*u;
if(g==NULL)panic(missing_operand);
/*89:*/
#line 1890 "gb_basic.w"
m= (directed?g->m:(g->m)/2);
new_graph= gb_new_graph(m);
if(new_graph==NULL)
panic(no_room);
make_compound_id(new_graph,"lines(",g,directed?",1)":",0)");
u= new_graph->vertices;
for(v= g->vertices+g->n-1;v>=g->vertices;v--){register Arc*a;
register long mapped= 0;
for(a= v->arcs;a;a= a->next){register Vertex*vv= a->tip;
if(!directed){
if(vv=g->vertices+g->n)goto near_panic;
}
/*91:*/
#line 1929 "gb_basic.w"
u->u.V= v;
u->v.V= vv;
u->w.A= a;
if(!directed){
if(u>=new_graph->vertices+m||(a+1)->tip!=v)goto near_panic;
if(v==vv&&a->next==a+1)a++;
else(a+1)->tip= u;
}
sprintf(buffer,"%.*s-%c%.*s",(BUF_SIZE-3)/2,v->name,
directed?'>':'-',BUF_SIZE/2-1,vv->name);
u->name= gb_save_string(buffer);
/*:91*/
#line 1905 "gb_basic.w"
;
if(!mapped){
u->map= v->map;
v->map= u;
mapped= 1;
}
u++;
}
}
if(u!=new_graph->vertices+m)goto near_panic;
/*:89*/
#line 1843 "gb_basic.w"
;
if(directed)/*92:*/
#line 1942 "gb_basic.w"
for(u= new_graph->vertices;uvertices+m;u++){
v= u->v.V;
if(v->arcs){
v= v->map;
do{gb_new_arc(u,v,1L);
v++;
}while(v->u.V==u->v.V);
}
}
/*:92*/
#line 1844 "gb_basic.w"
else/*93:*/
#line 1961 "gb_basic.w"
for(u= new_graph->vertices;uvertices+m;u++){register Vertex*vv;
register Arc*a;register long mapped= 0;
v= u->u.V;
for(vv= v->map;vvv.V;
for(a= v->arcs;a;a= a->next){
vv= a->tip;
if(vv=new_graph->vertices)gb_new_edge(u,vv,1L);
else if(vv>=v&&vvvertices+g->n)mapped= 1;
}
if(mapped&&v> u->u.V)
for(vv= v->map;vv->u.V==v;vv++)gb_new_edge(u,vv,1L);
}
/*:93*/
#line 1845 "gb_basic.w"
;
/*88:*/
#line 1875 "gb_basic.w"
for(u= new_graph->vertices,v= NULL;uvertices+m;u++){
if(u->u.V!=v){
v= u->u.V;
v->map= u->map;
u->map= NULL;
}
if(!directed)((u->w.A)+1)->tip= v;
}
/*:88*/
#line 1846 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
near_panic:/*90:*/
#line 1917 "gb_basic.w"
m= u-new_graph->vertices;
/*88:*/
#line 1875 "gb_basic.w"
for(u= new_graph->vertices,v= NULL;uvertices+m;u++){
if(u->u.V!=v){
v= u->u.V;
v->map= u->map;
u->map= NULL;
}
if(!directed)((u->w.A)+1)->tip= v;
}
/*:88*/
#line 1919 "gb_basic.w"
;
gb_recycle(new_graph);
panic(invalid_operand);
/*:90*/
#line 1852 "gb_basic.w"
;
}
/*:87*//*95:*/
#line 2009 "gb_basic.w"
#line 186 "gb_basic.ch"
Graph*product(
Graph*g,Graph*gg,
long type,
long directed)
#line 2014 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 2014 "gb_basic.w"
register Vertex*u,*vv;
register long n;
if(g==NULL||gg==NULL)panic(missing_operand);
/*96:*/
#line 2036 "gb_basic.w"
{float test_product= ((float)(g->n))*((float)(gg->n));
if(test_product> MAX_NNN)panic(very_bad_specs);
}
n= (g->n)*(gg->n);
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
for(u= new_graph->vertices,v= g->vertices,vv= gg->vertices;
uvertices+n;u++){
sprintf(buffer,"%.*s,%.*s",BUF_SIZE/2-1,v->name,(BUF_SIZE-1)/2,vv->name);
u->name= gb_save_string(buffer);
if(++vv==gg->vertices+gg->n)vv= gg->vertices,v++;
}
sprintf(buffer,",%d,%d)",(type?2:0)-(int)(type&1),directed?1:0);
make_double_compound_id(new_graph,"product(",g,",",gg,buffer);
/*:96*/
#line 2018 "gb_basic.w"
;
if((type&1)==0)/*97:*/
#line 2053 "gb_basic.w"
{register Vertex*uu,*uuu;
register Arc*a;
register siz_t delta;
delta= ((siz_t)(new_graph->vertices))-((siz_t)(gg->vertices));
for(u= gg->vertices;uvertices+gg->n;u++)
for(a= u->arcs;a;a= a->next){
v= a->tip;
if(!directed){
if(u> v)continue;
if(u==v&&a->next==a+1)a++;
}
for(uu= vert_offset(u,delta),vv= vert_offset(v,delta);
uuvertices+n;uu+= gg->n,vv+= gg->n)
if(directed)gb_new_arc(uu,vv,a->len);
else gb_new_edge(uu,vv,a->len);
}
/*98:*/
#line 2073 "gb_basic.w"
for(u= g->vertices,uu= new_graph->vertices;uuvertices+n;
u++,uu+= gg->n)
for(a= u->arcs;a;a= a->next){
v= a->tip;
if(!directed){
if(u> v)continue;
if(u==v&&a->next==a+1)a++;
}
vv= new_graph->vertices+((gg->n)*(v-g->vertices));
for(uuu= uu;uuun;uuu++,vv++)
if(directed)gb_new_arc(uuu,vv,a->len);
else gb_new_edge(uuu,vv,a->len);
}
/*:98*/
#line 2070 "gb_basic.w"
;
}
/*:97*/
#line 2019 "gb_basic.w"
;
if(type)/*99:*/
#line 2088 "gb_basic.w"
{Vertex*uu;Arc*a;
siz_t delta0=
((siz_t)(new_graph->vertices))-((siz_t)(gg->vertices));
siz_t del= (gg->n)*sizeof(Vertex);
register siz_t delta,ddelta;
for(uu= g->vertices,delta= delta0;uuvertices+g->n;uu++,delta+= del)
for(a= uu->arcs;a;a= a->next){
vv= a->tip;
if(!directed){
if(uu> vv)continue;
if(uu==vv&&a->next==a+1)a++;
}
ddelta= delta0+del*(vv-g->vertices);
for(u= gg->vertices;uvertices+gg->n;u++){register Arc*aa;
for(aa= u->arcs;aa;aa= aa->next){long length= a->len;
if(length> aa->len)length= aa->len;
v= aa->tip;
if(directed)
gb_new_arc(vert_offset(u,delta),vert_offset(v,ddelta),length);
else gb_new_edge(vert_offset(u,delta),
vert_offset(v,ddelta),length);
}
}
}
}
/*:99*/
#line 2020 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:95*//*105:*/
#line 2247 "gb_basic.w"
#line 233 "gb_basic.ch"
Graph*induced(
Graph*g,
char*description,
long self,
long multi,
long directed)
#line 2254 "gb_basic.w"
{/*9:*/
#line 198 "gb_basic.w"
Graph*new_graph;
register long i,j,k;
register long d;
register Vertex*v;
register long s;
/*:9*/
#line 2254 "gb_basic.w"
register Vertex*u;
register long n= 0;
register long nn= 0;
if(g==NULL)panic(missing_operand);
/*106:*/
#line 2269 "gb_basic.w"
/*107:*/
#line 2279 "gb_basic.w"
for(v= g->vertices;vvertices+g->n;v++)
if(v->ind> 0){
if(n> IND_GRAPH)panic(very_bad_specs);
if(v->ind>=IND_GRAPH){
if(v->subst==NULL)panic(missing_operand+1);
n+= v->subst->n;
}else n+= v->ind;
}else if(v->ind<-nn)nn= -(v->ind);
if(n> IND_GRAPH||nn> IND_GRAPH)panic(very_bad_specs+1);
n+= nn;
/*:107*/
#line 2270 "gb_basic.w"
;
new_graph= gb_new_graph(n);
if(new_graph==NULL)
panic(no_room);
/*108:*/
#line 2306 "gb_basic.w"
for(k= 1,u= new_graph->vertices;k<=nn;k++,u++){
u->mult= -k;
sprintf(buffer,"%ld",-k);
u->name= gb_save_string(buffer);
}
for(v= g->vertices;vvertices+g->n;v++)
if((k= v->ind)<0)v->map= (new_graph->vertices)-(k+1);
else if(k> 0){
u->mult= k;
v->map= u;
if(k<=2){
u->name= gb_save_string(v->name);
u++;
if(k==2){
sprintf(buffer,"%s'",v->name);
u->name= gb_save_string(buffer);
u++;
}
}else if(k>=IND_GRAPH)/*114:*/
#line 2421 "gb_basic.w"
{register Graph*gg= v->subst;
register Vertex*vv= gg->vertices;
register Arc*a;
siz_t delta= ((siz_t)u)-((siz_t)vv);
for(j= 0;jsubst->n;j++,u++,vv++){
sprintf(buffer,"%.*s:%.*s",BUF_SIZE/2-1,v->name,(BUF_SIZE-1)/2,vv->name);
u->name= gb_save_string(buffer);
for(a= vv->arcs;a;a= a->next){register Vertex*vvv= a->tip;
Vertex*uu= vert_offset(vvv,delta);
if(vvv==vv&&!self)continue;
if(uu->tmp==u&&!multi)/*113:*/
#line 2409 "gb_basic.w"
{register Arc*b= uu->tlen;
if(a->lenlen){
b->len= a->len;
if(!directed)(b+1)->len= a->len;
}
continue;
}
/*:113*/
#line 2432 "gb_basic.w"
;
if(!directed){
if(vvvnext==a+1)a++;
gb_new_edge(u,uu,a->len);
}else gb_new_arc(u,uu,a->len);
uu->tmp= u;
uu->tlen= ((directed||u<=uu)?u->arcs:uu->arcs);
}
}
}
/*:114*/
#line 2325 "gb_basic.w"
else for(j= 0;jname,j);
u->name= gb_save_string(buffer);
}
}
/*:108*/
#line 2274 "gb_basic.w"
;
sprintf(buffer,",%s,%d,%d,%d)",description?description:null_string,
self?1:0,multi?1:0,directed?1:0);
make_compound_id(new_graph,"induced(",g,buffer);
/*:106*/
#line 2259 "gb_basic.w"
;
/*110:*/
#line 2355 "gb_basic.w"
for(v= g->vertices;vvertices+g->n;v++){
u= v->map;
if(u){register Arc*a;register Vertex*uu,*vv;
k= u->mult;
if(k<0)k= 1;
else if(k>=IND_GRAPH)k= v->subst->n;
for(;k;k--,u++){
if(!multi)
/*111:*/
#line 2391 "gb_basic.w"
for(a= u->arcs;a;a= a->next){
a->tip->tmp= u;
if(directed||a->tip> u||a->next==a+1)a->tip->tlen= a;
else a->tip->tlen= a+1;
}
/*:111*/
#line 2364 "gb_basic.w"
;
for(a= v->arcs;a;a= a->next){
vv= a->tip;
uu= vv->map;
if(uu==NULL)continue;
j= uu->mult;
if(j<0)j= 1;
else if(j>=IND_GRAPH)j= vv->subst->n;
if(!directed){
if(vvnext==a+1)a++;
j= k,uu= u;
}
}
/*112:*/
#line 2398 "gb_basic.w"
for(;j;j--,uu++){
if(u==uu&&!self)continue;
if(uu->tmp==u&&!multi)
/*113:*/
#line 2409 "gb_basic.w"
{register Arc*b= uu->tlen;
if(a->lenlen){
b->len= a->len;
if(!directed)(b+1)->len= a->len;
}
continue;
}
/*:113*/
#line 2402 "gb_basic.w"
;
if(directed)gb_new_arc(u,uu,a->len);
else gb_new_edge(u,uu,a->len);
uu->tmp= u;
uu->tlen= ((directed||u<=uu)?u->arcs:uu->arcs);
}
/*:112*/
#line 2380 "gb_basic.w"
;
}
}
}
}
/*:110*/
#line 2260 "gb_basic.w"
;
/*109:*/
#line 2332 "gb_basic.w"
for(v= g->vertices;vvertices+g->n;v++)
if(v->map)v->ind= v->map->mult;
for(v= new_graph->vertices;vvertices+n;v++)
v->u.I= v->v.I= v->z.I= 0;
/*:109*/
#line 2261 "gb_basic.w"
;
if(gb_trouble_code){
gb_recycle(new_graph);
panic(alloc_fault);
}
return new_graph;
}
/*:105*/
#line 36 "gb_basic.w"
/*101:*/
#line 2169 "gb_basic.w"
#line 198 "gb_basic.ch"
Graph*bi_complete(
unsigned long n1,
unsigned long n2,
long directed)
#line 2174 "gb_basic.w"
{Graph*new_graph= board(2L,0L,0L,0L,1L,0L,directed);
if(new_graph){
new_graph->vertices->ind= n1;
(new_graph->vertices+1)->ind= n2;
new_graph= induced(new_graph,NULL,0L,0L,directed);
if(new_graph){
sprintf(new_graph->id,"bi_complete(%lu,%lu,%d)",
n1,n2,directed?1:0);
mark_bipartite(new_graph,n1);
}
}
return new_graph;
}
/*:101*//*103:*/
#line 2222 "gb_basic.w"
#line 210 "gb_basic.ch"
Graph*wheel(
unsigned long n,
unsigned long n1,
long directed)
#line 2227 "gb_basic.w"
{Graph*new_graph= board(2L,0L,0L,0L,1L,0L,directed);
if(new_graph){
new_graph->vertices->ind= n1;
(new_graph->vertices+1)->ind= IND_GRAPH;
(new_graph->vertices+1)->subst= board(n,0L,0L,0L,1L,1L,directed);
new_graph= induced(new_graph,NULL,0L,0L,directed);
if(new_graph){
sprintf(new_graph->id,"wheel(%lu,%lu,%d)",
n,n1,directed?1:0);
}
}
return new_graph;
}
/*:103*/
#line 37 "gb_basic.w"
/*:2*/