int main(int argc, char *argv[]) { int i, rank; Arraylist r; assert(argc > 1); rank = atoi(argv[1]); r = allGraphs(rank); if (rank % 2 == 1){ printf("Graphs: %d.\n", r->size); printAsGraphList(rank, r); } else { Arraylist r0, r1; r0 = newArraylist(5); r1 = newArraylist(5); for (i = 0 ; i < r->size ; i++) { if (matched(rank, r->it[i])) putItem(r->it[i], r0); else putItem(r->it[i], r1); } printf("Matched graphs: %d.\n", r0->size); printAsGraphList(rank, r0); printf("Unmatched graphs: %d.\n", r1->size); printAsGraphList(rank, r1); freeArraylist(r0); freeArraylist(r1); } freeArraylist(r); freePerm(); #if 0 reportCnt(); reportACnt(); reportGCnt(); #endif return 0; }
/* Pre: perm is initialized, hist[0..rank-1] is descending. * Create the list of permutations (as powers of 2) * that preserve hist[0..rank-1] */ Arraylist specPerm(int rank, int* hist) { int i, j, k, m, x; Intstack prim = newIntstack(rank, NULL) ; Arraylist result = newArraylist(1) ; Arraylist locperm; prim->size = rank; for (i = 0, x = 1; i < rank; i++, x <<= 1) { prim->it[i] = x; } putItem(prim, result) ; i = 0; while (i + 1 < rank) { j = i+1; while (j < rank && hist[i] == hist[j]) j++; if (i+1 < j) { x = result->size; locperm = getPerm(j-i) ; for (k = 0; k < locperm->size - 1; k++) for (m = 0; m < x; m++) putItem(applyPerm(i, result->it[m], locperm->it[k]), result) ; } i = j; } return result; }
Arraylist getPerm(int rank) { int i, j, k; Intstack y, z; if (!permInit) initPerm() ; if (perm[rank] != NULL) return perm[rank]; if (perm[rank-1] == NULL) getPerm(rank-1) ; perm[rank] = newArraylist(rank * perm[rank-1]->size) ; for (i = 0; i < perm[rank-1]->size; i++) { y = perm[rank-1]->it[i]; for (j = 0; j < rank; j++) { z = newIntstack(rank, NULL); for (k = 0; k < j; k++) z->it[k] = y->it[k]; z->it[j] = rank - 1; for (k = j; k < y->size; k++) z->it[k+1] = y->it[k]; z->size = rank; putItem(z, perm[rank]) ; } } return perm[rank]; }
void initPerm() { int i; Intstack p0, p1; if (permInit) return; permInit = 1; for (i = 0; i < RANKLIM; i++) perm[i] = NULL; perm[0] = newArraylist(1) ; perm[1] = newArraylist(1) ; p0 = newIntstack(0, NULL) ; putItem(p0, perm[0]) ; p1 = newIntstack(1, NULL) ; putint(0, p1) ; putItem(p1, perm[1]) ; }
Arraylist allGraphs(int rank) { Arraylist result = newArraylist(rank); Intstack cand = newIntstack(0, NULL), fg = fullgraph(rank); unsigned long int x, y, ulim = 1 << fg->size; int i; setRank(rank); for (x = 0L; x < ulim; x++) { cand->size = 0; y = x; i = 0; while (y > 0) { if (y % 2 == 1) putint(fg->it[i], cand); y /= 2; i++; } if (portHistDescending(cand)) { putItem((void*) newIntstack(0, cand), result); } } freestack(cand); freestack(fg); sortAndWeedForGraphs(rank, result); return result; }
int main() { ARRAYLIST* list = newArraylist(); addElement(list, "Bryan",0); addElement(list, "Jarne",1); addElement(list, "Henk",2); addElement(list, "Kees",3); addElement(list, "Boudewijn",4); printList(list); removeElement(list, 0); printList(list); return 0; }
Arraylist rawPermVariants(int rank, Intstack cell) { int i, h[RANKLIM]; Arraylist perms; Arraylist result; portHisto(cell, h) ; perms = specPerm(rank, h) ; result = newArraylist(perms->size) ; for (i = 0; i < perms->size; i++) { putItem(permuteCell(cell, perms->it[i]), result) ; freestack(perms->it[i]) ; } freeArraylist(perms) ; return result; }