#include #include #include #include #define AJM(x,y) ajm[x][y] = ajm[y][x] typedef enum { kNone, kStar, kMax, kBranch } Mode; static void xit(int rc, const char *msg, ...) { va_list v; va_start(v, msg); vfprintf(rc ? stderr : stdout, msg, v); exit(rc); va_end(v); } static int ij2var(int i, int j, int vert) { int ma = i > j ? i : j; int mi = i < j ? i : j; int no = (2*vert - 1 - mi)*mi/2 + ma - mi; return no; } static int product(int **ajm, int *sum, int i, int j, int m, int n) { if (i == j || m == n) return 0; if ((i == m && j == n) || (i == n && j == m)) { if (ajm[i][j] < 0) { printf("+1 x%d ",-ajm[i][j]); return 1; } else { *sum += ajm[i][j]; return 0; } } if (ajm[i][j] < 0) { if (ajm[m][n] < 0) { printf("+1 x%d x%d ", -ajm[i][j], -ajm[m][n]); return 1; } else { if (ajm[m][n]) { printf("+1 x%d ", -ajm[i][j]); return 1; } } } else { if (ajm[m][n] < 0) { if (ajm[i][j]) { printf("+1 x%d ", -ajm[m][n]); return 1; } } else { *sum += ajm[i][j]*ajm[m][n]; } } return 0; } static int fill_matrix(int **ajm, int verts, int valence, int adjac, int ndjac, Mode mode, int branch) { int i, j, cnt; for(i=0; i= 98) xit(4, "Miscalculated_1 k = %d\n", k); AJM(i, k) = 1; AJM(k, j) = 1; k++; AJM(i+1, k) = 1; AJM(k, j) = 1; k++; } } if (k != 99) xit(4, "Miscalculated_2 k = %d\n", k); for (i=0; i<=14; i++) { for (j=0; j<99; j++) { if (ajm[i][j] < 0) AJM(i,j) = 0; } } } if (verts == 65 && valence == 32 && adjac == 15 && ndjac == 16) { AJM(0,1) = 1; AJM(0,2) = 0; // partly undo the star for(i=3; i<=17; i++) { AJM(0,i) = 1; AJM(1,i) = 1; } for(i=0; i<16; i++) { AJM(0, 18+i) = 1; AJM(1, 34+i) = 1; } AJM(2, 18) = 1; AJM(2, 34) = 1; for(i=0; i 15) xit(1, "--branch must be 0..15 for this graph."); for (i=0; i < branch; i++) { AJM(2,i+3) = 1; AJM(2,i+50) = 1; } for (i=0; i < 16-branch; i++) { AJM(2,i+18) = 1; AJM(2,i+34) = 1; } for(i=0; i= '0' && p[j] <= '9'; j++) ; if (j && p[j]==0) { mode = kBranch; branch = atoi(p); } else { xit(1, "Wrong argument: %s\n", p); } } } else if (!strncmp(argv[i],"--srg=", 6)) { if(sscanf(argv[i]+6, "%d,%d,%d,%d", &verts, &valence, &adjac, &ndjac) != 4) xit(1, "Wrong --srg= format.\n"); } else { xit(1, "Unknown argument: %s\n", argv[i]); } } if (verts==0 || valence == 0 || (verts-valence-1)*ndjac != (valence-adjac-1)*valence) xit(1, "Contradictary SRG params: (%d, %d, %d, %d)\n", verts, valence, adjac, ndjac); ajm = malloc(sizeof(int *)*verts); for (i=0; i= 0); if (no_subst) printf("* #variable= %d #constraint= %d #product= %d sizeproduct= %d\n" ,verts*(verts-1)/2, verts*(verts+1)/2 + num_count, verts*(verts-1)*(verts-2)/2, verts*(verts-1)*(verts-2)); else printf("* #variable= %d #constraint= %d #product= %d sizeproduct= %d\n" ,vars, constrs+eqns, prods, 2*prods); printf("* "); for (i=0; i= 0) printf("%d", ajm[i][j]); else printf("?"); } printf("\n"); } if (no_subst) { for(i=0; i < verts; i++) // constants for(j=i+1; j= 0) printf("+1 x%d = %+d;\n", ij2var(i, j, verts), ajm[i][j]); for (i=0; i= 0) sum += ajm[i][j]; else printf("+1 x%d ",-ajm[i][j]); } printf("= %+d;\n", valence-sum); } } for (i=0; i