/** ** CREATED: 02006.03.13 ABS copied from t_filter ** MODIFIED: 02006.03.14 ABS added plotting ** MODIFIED: 02006.03.15 ABS refined, added analysis ** MODIFIED: 02006.03.16 ABS made do only 1 system size ** MODIFIED: 02006.03.26 ABS debugged, added multi-start state plotting ** **/ #include "all_systems.h" main(argc, argv) int argc; char** argv; { /* declare functions */ double atof(); int increment(); /* declare local variables */ int i, j, v, n, variation, start_state, step, state; int current_transit_array[MAX_STATES]; int transit_array[MAX_VARIATIONS][MAX_STATES]; /* history[variation][start_state][step] */ int history[MAX_VARIATIONS][MAX_STATES][MAX_STATES]; int stats[MAX_VARIATIONS][MAX_STATES][2]; int carry, head, orbit; int percents[MAX_STATES][MAX_STATES]; char spacer[MAX_STATES]; int num_variations; /* initialize global variables (including parameters) */ defaultParms(); parseArgs(argc, argv); if (Debug != FALSE) { fprintf(stderr, "%s: DEBUG: Plot = %d\n", argv[0], Plot); fprintf(stderr, "%s: DEBUG: Analyze = %d\n", argv[0], Analyze); fprintf(stderr, "%s: DEBUG: S = %d\n", argv[0], S); fprintf(stderr, "%s: DEBUG: NS = %d\n", argv[0], NS); } /* initialize local variables */ num_variations = a_to_the_b(S, S); if (Debug != FALSE) { fprintf(stderr, "%s: DEBUG: num_variations = %d\n", argv[0], num_variations); } /* header writes */ fprintf(stdout, "==== system_size = %d ====\n", S); /* outer loop: variation */ for (variation = 1; variation <= num_variations; variation++) { /* fill system with transitions */ if (variation == 1) { for (i = 1; i <= S; i++) { current_transit_array[i] = 1; } } else { carry = TRUE; for (i = 1; i <= S; i++) { if (carry) { carry = increment(¤t_transit_array[i], S); } } } for (i = 1; i <= S; i++) { transit_array[variation][i] = current_transit_array[i]; } for (start_state = 1; start_state <= NS; start_state++) { /* simulate the system in time */ state = start_state; /* history[variation][start_state][step] */ history[variation][start_state][0] = state; for (step = 1; step <= S + 2; step++) { state = transit_array[variation][state]; history[variation][start_state][step] = state; } } /* end for start_state */ /* analyze history */ for (start_state = 1; start_state <= NS; start_state++) { for (n = 0; n < 2; n++) { stats[variation][start_state][n] = 0; } } for (start_state = 1; start_state <= NS; start_state++) { for (i = 0; i <= S + 1; i++) { for (j = 0; j <= S + 1; j++) { /* history[variation][start_state][step] */ if ((i != j) && (history[variation][start_state][i] == history[variation][start_state][j])) { goto out_of_loop; } } } out_of_loop: head = i; orbit = j - i; stats[variation][start_state][0] = head; stats[variation][start_state][1] = orbit; } /* end for start_state */ } /* end for variation */ /* display history */ if (Plot) { for (variation = 1; variation <= num_variations; variation++) { bar(S, NS); /* KLUDGE */ if (NS == 1) strcpy(spacer, ""); if (NS == 2) strcpy(spacer, " "); if (NS == 3) strcpy(spacer, " "); if (NS == 4) strcpy(spacer, " "); if (NS == 5) strcpy(spacer, " "); if (NS == 6) strcpy(spacer, " "); if (NS == 7) strcpy(spacer, " "); for (i = 1; i <= S; i++) { fprintf(stdout, "| %s%1d ", spacer, transit_array[variation][i]); } fprintf(stdout, "|\n"); bar(S, NS); for (step = 0; step <= S; step++) { for (state = 1; state <= S; state++) { fprintf(stdout, "| "); for (start_state = 1; start_state <= NS; start_state++) { /* history[variation][start_state][step] */ if (history[variation][start_state][step] == state) { fprintf(stdout, "%1d", start_state); } else { fprintf(stdout, " ", start_state); } } fprintf(stdout, " "); } fprintf(stdout, "|\n"); } if (Analyze) { bar(S, NS); /* head & orbit list */ for (start_state = 1; start_state <= NS; start_state++) { fprintf(stdout, "size: %d variation: %d start_state: %d head: %d orbit: %d\n", S, variation, start_state, stats[variation][start_state][0], stats[variation][start_state][1]); } } } bar(S, NS); } /* end if Plot */ else { for (variation = 1; variation <= num_variations; variation++) { fprintf(stdout, "---- variation = %d ----\n", variation); for (i = 1; i <= S; i++) { fprintf(stdout, "%1d -> %1d ", i, transit_array[variation][i]); } fprintf(stdout, "\n"); for (step = 0; step <= S; step++) { fprintf(stdout, "step %1d: ", step); for (start_state = 1; start_state <= NS; start_state++) { fprintf(stdout, " %1d", history[variation][start_state][step]); } fprintf(stdout, "\n"); } /* head & orbit list */ for (start_state = 1; start_state <= NS; start_state++) { fprintf(stdout, "size: %d variation: %d start_state: %d head: %d orbit: %d\n", S, variation, start_state, stats[variation][start_state][0], stats[variation][start_state][1]); } } } /* analysis */ /* accumulate per centage numerators in a 2d array: head vs. orbit */ if (Analyze) { for (i = 0; i < MAX_STATES; i++) { for (j = 0; j < MAX_STATES; j++) { percents[i][j] = 0; } } for (variation = 1; variation <= num_variations; variation++) { for (start_state = 1; start_state <= NS; start_state++) { percents[stats[variation][start_state][0]] [stats[variation][start_state][1]]++; } } fprintf(stdout, "denom = %f\n", (double)(num_variations*NS)); for (j = 0; j < MAX_STATES; j++) { for (i = 0; i < MAX_STATES; i++) { if (percents[i][j] != 0) { fprintf(stdout, "head: %d orbit: %d count: %d percent: %f\n", i, j, percents[i][j], 100.0*(double)percents[i][j]/ (double)(num_variations*NS)); } } } } /* end if Analyze */ } /* end main */ /* * increment - increment an array value modulo */ int increment(array_address, max) int *array_address; int max; { *array_address = *array_address + 1; if(*array_address > max) { *array_address = 1; return(TRUE); } else { return(FALSE); } } /* * a_to_the_b - raise a to the b power (positive integers) */ int a_to_the_b(a, b) int a, b; { int temp = 1; int j; for (j = 1; j <= b; j++) { temp = temp*a; } return(temp); } /* * defaultParms - initialize global variables */ defaultParms() { Debug = FALSE; Plot = FALSE; Analyze = FALSE; S = 3; NS = 1; } /* end defaultParms() */ /* * parseArgs - parse arguments into global variables */ parseArgs(argc, argv) int argc; char** argv; { int i; for (i = 0; i < argc; i++) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 'A' : Analyze = TRUE; break; case 'D' : Debug = TRUE; break; case 'h' : help(argv); exit(0); break; case 'n' : NS = atoi(&argv[++i][0]); break; case 'P' : Plot = TRUE; break; case 's' : S = atoi(&argv[++i][0]); break; case 'u' : usage(argv); exit(0); break; default: fprintf(stderr, "%s: ERROR: illegal flag: %s\n", argv[0], argv[i]); usage(argv); exit(0); break; } /* end switch */ } /* end if */ } /* end for(i) */ } /* end parseArgs() */ bar(int s, int ns) { int i, n; for (i = 1; i <= s; i++) { fprintf(stdout, "+--"); for (n = 1; n <= ns; n++) { fprintf(stdout, "-"); } } fprintf(stdout, "+\n"); } /* end bar() */