/* Generates a random Boolean network with n nodes which has "critical line" dynamic behaviour. */ /* Each node is assigned independently and uniformly at random a Boolean function of up to 2 variables. */ /* The resulting network in the .cnet format is printed out on the standart output. */ /* To generate, for a example, a network with 100 nodes into the output file "output_file" */ /* complile the program, and then use the command: */ /* ./a.out 100 > output_file */ #include #include #include #include #include #include static void print_function(int i, int a, int b, int f); /* --------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { int i, a, b, f; int number_of_nodes; srand(time(0)); printf("#random = %d\n\n", time(0)); if (argc < 1) { printf("Not enough arguments!\n"); return (1); } number_of_nodes = atoi(argv[1]); printf(".v %d\n\n", number_of_nodes); /* generate a random Boolean network on the critical line in .cnet format */ for(i = 1; i < number_of_nodes+1; i++) { a = rand()%number_of_nodes+1; b = rand()%number_of_nodes+1; f = rand()%16; print_function(i,a,b,f); printf("\n"); } return(0); } /* -----------------------------------------------------------------------------*/ /* prints a truth table of each possible 2-variable function f(a,b) */ /* ab 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */ /* 00 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 */ /* 01 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 */ /* 10 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 */ /* 11 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 */ /* ----------------------------------------------------------------------------- */ static void print_function(int i, int a, int b, int f) { switch(f) { case 0: printf(".n %d 0\n", i); printf("0\n"); break; case 1: printf(".n %d 2 %d %d\n", i, a, b); printf("00 1\n"); printf("1- 0\n"); printf("-1 0\n"); break; case 2: printf(".n %d 2 %d %d\n", i, a, b); printf("01 1\n"); printf("1- 0\n"); printf("-0 0\n"); break; case 3: printf(".n %d 1 %d\n", i, a); printf("0 1\n"); printf("1 0\n"); break; case 4: printf(".n %d 2 %d %d\n", i, a, b); printf("10 1\n"); printf("0- 0\n"); printf("-1 0\n"); break; case 5: printf(".n %d 1 %d\n", i, b); printf("0 1\n"); printf("1 0\n"); break; case 6: printf(".n %d 2 %d %d\n", i, a, b); printf("00 0\n"); printf("01 1\n"); printf("10 1\n"); printf("11 0\n"); break; case 7: printf(".n %d 2 %d %d\n", i, a, b); printf("11 0\n"); printf("0- 1\n"); printf("-0 1\n"); break; case 8: printf(".n %d 2 %d %d\n", i, a, b); printf("11 1\n"); printf("0- 0\n"); printf("-0 0\n"); break; case 9: printf(".n %d 2 %d %d\n", i, a, b); printf("00 1\n"); printf("01 0\n"); printf("10 0\n"); printf("11 1\n"); break; case 10: printf(".n %d 1 %d\n", i, b); printf("0 0\n"); printf("1 1\n"); break; case 11: printf(".n %d 2 %d %d\n", i, a, b); printf("10 0\n"); printf("0- 1\n"); printf("-1 1\n"); break; case 12: printf(".n %d 1 %d\n", i, a); printf("0 0\n"); printf("1 1\n"); break; case 13: printf(".n %d 2 %d %d\n", i, a, b); printf("01 0\n"); printf("1- 1\n"); printf("-0 1\n"); break; case 14: printf(".n %d 2 %d %d\n", i, a, b); printf("00 0\n"); printf("1- 1\n"); printf("-1 1\n"); break; case 15: printf(".n %d 0\n", i); printf("1\n"); break; default: printf("ERROR\n"); } }