Add C version (20x faster)
This commit is contained in:
		
							parent
							
								
									f72bbfbe96
								
							
						
					
					
						commit
						915ec5c9b8
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					/tags
 | 
				
			||||||
 | 
					/a.out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										106
									
								
								random_boolean_network.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								random_boolean_network.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,106 @@
 | 
				
			|||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NUM_NODES 80
 | 
				
			||||||
 | 
					#define NUM_CONNECTIONS 4
 | 
				
			||||||
 | 
					#define NUM_GENERATIONS 250
 | 
				
			||||||
 | 
					#define TRUTH_TABLE_SIZE (1 << NUM_CONNECTIONS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const unsigned char CHAR_ZERO = '0';
 | 
				
			||||||
 | 
					const unsigned char CHAR_ONE = ' ';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int nodes[NUM_NODES];
 | 
				
			||||||
 | 
					unsigned int buffer[NUM_NODES];
 | 
				
			||||||
 | 
					unsigned int connections[NUM_NODES][NUM_CONNECTIONS];
 | 
				
			||||||
 | 
					unsigned int truth_table[TRUTH_TABLE_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void randomize_boolean_array(unsigned int *arr, unsigned int length);
 | 
				
			||||||
 | 
					void randomize_connections();
 | 
				
			||||||
 | 
					void propagate();
 | 
				
			||||||
 | 
					void print_truth_table();
 | 
				
			||||||
 | 
					void print_connections();
 | 
				
			||||||
 | 
					void print_generation(unsigned int g);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    srand(time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    randomize_boolean_array(nodes, NUM_NODES);
 | 
				
			||||||
 | 
					    randomize_boolean_array(truth_table, TRUTH_TABLE_SIZE);
 | 
				
			||||||
 | 
					    randomize_connections();
 | 
				
			||||||
 | 
					    print_truth_table();
 | 
				
			||||||
 | 
					    print_connections();
 | 
				
			||||||
 | 
					    print_generation(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (unsigned int i = 1; i < NUM_GENERATIONS; i++) {
 | 
				
			||||||
 | 
					        propagate();
 | 
				
			||||||
 | 
					        print_generation(i);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void propagate()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i, j, tt_index;
 | 
				
			||||||
 | 
					    memcpy(buffer, nodes, NUM_NODES * sizeof(unsigned int));
 | 
				
			||||||
 | 
					    for (i = 0; i < NUM_NODES; i++) {
 | 
				
			||||||
 | 
					        tt_index = 0;
 | 
				
			||||||
 | 
					        for (j = 0; j < NUM_CONNECTIONS; j++) {
 | 
				
			||||||
 | 
					            tt_index += buffer[connections[i][j]] << (NUM_CONNECTIONS - 1 - j);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        nodes[i] = truth_table[tt_index];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void randomize_boolean_array(unsigned int *arr, unsigned int length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for (unsigned int i = 0; i < length; i++) {
 | 
				
			||||||
 | 
					        arr[i] = rand() % 2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void randomize_connections()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i, j;
 | 
				
			||||||
 | 
					    for (i = 0; i < NUM_NODES; i++) {
 | 
				
			||||||
 | 
					        for (j = 0; j < NUM_CONNECTIONS; j++) {
 | 
				
			||||||
 | 
					            connections[i][j] = rand() % 20;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_truth_table() 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i;
 | 
				
			||||||
 | 
					    printf("Truth table:\n");
 | 
				
			||||||
 | 
					    for (i = 0; i < TRUTH_TABLE_SIZE; i++) {
 | 
				
			||||||
 | 
					        printf("[%3d] => [%d]\n", i, truth_table[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_connections() 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i, j;
 | 
				
			||||||
 | 
					    printf("Connections:\n");
 | 
				
			||||||
 | 
					    for (i = 0; i < NUM_NODES; i++) {
 | 
				
			||||||
 | 
					        printf("[%3d] => [", i);
 | 
				
			||||||
 | 
					        for (j = 0; j < NUM_CONNECTIONS; j++) {
 | 
				
			||||||
 | 
					            printf("%d, ", connections[i][j]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        printf("]\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_generation(unsigned int g)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i;
 | 
				
			||||||
 | 
					    printf("G%5d  ", g);
 | 
				
			||||||
 | 
					    for (i = 0; i < NUM_NODES; i++) {
 | 
				
			||||||
 | 
					        printf("%c ", nodes[i] == 0 ? CHAR_ZERO : CHAR_ONE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -8,9 +8,9 @@
 | 
				
			|||||||
    Fri 13 Nov
 | 
					    Fri 13 Nov
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const NUM_NODES = 20;
 | 
					const NUM_NODES = 80;
 | 
				
			||||||
const NUM_CONNECTIONS = 3;
 | 
					const NUM_CONNECTIONS = 4;
 | 
				
			||||||
const NUM_GENERATIONS = 20;
 | 
					const NUM_GENERATIONS = 250;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const CHAR_ON_ZERO = '0';
 | 
					const CHAR_ON_ZERO = '0';
 | 
				
			||||||
const CHAR_ON_ONE = ' ';
 | 
					const CHAR_ON_ONE = ' ';
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user