Skip to content

Commit e60a780

Browse files
neat fixes
1 parent 1e59d89 commit e60a780

File tree

6 files changed

+213
-8
lines changed

6 files changed

+213
-8
lines changed

src/fully_connected_layers.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,7 +1614,7 @@ uint64_t get_array_size_params(fcl* f){
16141614
* @ flc* f:= the fully-connected layer
16151615
* */
16161616
uint64_t get_array_size_scores_fcl(fcl* f){
1617-
if(f == NULL || !exists_edge_popup_stuff_fcl(f))
1617+
if(f == NULL || !exists_edge_popup_stuff_fcl(f) || f->feed_forward_flag == ONLY_DROPOUT)
16181618
return 0;
16191619
return (uint64_t)f->input*f->output;
16201620
}
@@ -1628,7 +1628,7 @@ uint64_t get_array_size_scores_fcl(fcl* f){
16281628
* @ flc* f:= the fully-connected layer
16291629
* */
16301630
uint64_t get_array_size_weights(fcl* f){
1631-
if(f == NULL || !exists_params_fcl(f))
1631+
if(f == NULL || !exists_params_fcl(f) || f->feed_forward_flag == ONLY_DROPOUT)
16321632
return 0;
16331633
uint64_t sum = 0;
16341634
if(f->normalization_flag == LAYER_NORMALIZATION){
@@ -1665,7 +1665,7 @@ void memcopy_vector_to_params(fcl* f, float* vector){
16651665
* @ float* vector:= the vector where is copyed everything
16661666
* */
16671667
void memcopy_vector_to_scores(fcl* f, float* vector){
1668-
if(f == NULL || vector == NULL || !exists_edge_popup_stuff_fcl(f))
1668+
if(f == NULL || vector == NULL || !exists_edge_popup_stuff_fcl(f) || f->feed_forward_flag == ONLY_DROPOUT)
16691669
return;
16701670
memcpy(f->scores,vector,f->input*f->output*sizeof(float));
16711671
}
@@ -1698,7 +1698,7 @@ void memcopy_params_to_vector(fcl* f, float* vector){
16981698
* @ float* vector:= the vector where is copyed everything
16991699
* */
17001700
void memcopy_weights_to_vector(fcl* f, float* vector){
1701-
if(f == NULL || !exists_params_fcl(f) || vector == NULL)
1701+
if(f == NULL || !exists_params_fcl(f) || vector == NULL || f->feed_forward_flag == ONLY_DROPOUT)
17021702
return;
17031703
memcpy(vector,f->weights,f->input*f->output*sizeof(float));
17041704
if(f->normalization_flag == LAYER_NORMALIZATION){
@@ -1716,7 +1716,7 @@ void memcopy_weights_to_vector(fcl* f, float* vector){
17161716
* @ float* vector:= the vector where is copyed everything
17171717
* */
17181718
void memcopy_vector_to_weights(fcl* f, float* vector){
1719-
if(f == NULL || !exists_params_fcl(f) || vector == NULL)
1719+
if(f == NULL || !exists_params_fcl(f) || vector == NULL || f->feed_forward_flag == ONLY_DROPOUT)
17201720
return;
17211721
memcpy(f->weights,vector,f->input*f->output*sizeof(float));
17221722
if(f->normalization_flag == LAYER_NORMALIZATION){
@@ -1734,7 +1734,7 @@ void memcopy_vector_to_weights(fcl* f, float* vector){
17341734
* @ float* vector:= the vector where is copyed everything
17351735
* */
17361736
void memcopy_scores_to_vector(fcl* f, float* vector){
1737-
if(f == NULL || vector == NULL || !exists_edge_popup_stuff_fcl(f))
1737+
if(f == NULL || vector == NULL || !exists_edge_popup_stuff_fcl(f) || f->feed_forward_flag == ONLY_DROPOUT)
17381738
return;
17391739
memcpy(vector,f->scores,f->input*f->output*sizeof(float));
17401740
}

src/genome.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ typedef struct connection{
4545
typedef struct genome{
4646
struct node** all_nodes; /*the first nodes are inputs and outputs*/
4747
int number_input,number_output, number_total_nodes,specie_rip;
48+
int global_inn_numb_connections, global_inn_numb_nodes;
4849
float fitness;
4950
}genome;
5051

src/model.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,7 @@ void ff_fcl_fcl(fcl* f1, fcl* f2){
13181318
}
13191319

13201320
int ff_fcl_fcl_without_arrays(fcl* f1, fcl* f2){
1321-
if(f1->output != f2->input){
1321+
if(f1->output != f2->input || f2->feed_forward_flag == ONLY_DROPOUT){
13221322
return 0;
13231323
}
13241324
return 1;

src/neat.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ void neat_generation_run(neat* nes){
221221

222222
//save best genome of the generation in a file
223223
if(nes->k%nes->saving == 0 || nes->k == nes->generations)
224-
save_genome(gg[nes->j],nes->global_inn_numb_connections,nes->k+1);
224+
save_genome_complete(gg[nes->j],nes->global_inn_numb_connections,nes->global_inn_numb_nodes, nes->k+1);
225225

226226
// if we have reached the number of generations then just end
227227
if(nes->k == nes->generations)

src/neat_functions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ float random_float_number(float a);
4242
int shuffle_connection_set(connection** m,int n);
4343
int shuffle_genome_set(genome** m,int n);
4444
int save_genome(genome* g, int global_inn_numb_connections, int numb);
45+
int save_genome_complete(genome* g, int global_inn_numb_connections, int global_inn_numb_nodes, int numb);
4546
genome* load_genome(int global_inn_numb_connections, char* filename);
47+
genome* load_genome_complete(char* filename);
48+
int get_global_innovation_number_connections_from_genome(genome* g);
49+
int get_global_innovation_number_nodes_from_genome(genome* g);
4650
int round_up(float num);
4751
char* get_genome_array(genome* g, int global_inn_numb_connections);
4852
genome* init_genome_from_array(int global_inn_numb_connections, char* g_array);

src/neat_utils.c

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,80 @@ int save_genome(genome* g, int global_inn_numb_connections, int numb){
101101

102102
}
103103

104+
int save_genome_complete(genome* g, int global_inn_numb_connections, int global_inn_numb_nodes, int numb){
105+
106+
int i,n;
107+
connection** c = get_connections(g,global_inn_numb_connections);
108+
n = get_numb_connections(g,global_inn_numb_connections);
109+
char string[20];
110+
char *s = ".bin";
111+
FILE *write_ptr;
112+
113+
itoa(numb, string);
114+
115+
strcat(string,s);
116+
117+
write_ptr = fopen(string,"wb");
118+
convert_data(&global_inn_numb_connections,sizeof(int),1);
119+
fwrite(&global_inn_numb_connections,sizeof(int),1,write_ptr);
120+
convert_data(&global_inn_numb_connections,sizeof(int),1);
121+
convert_data(&global_inn_numb_nodes,sizeof(int),1);
122+
fwrite(&global_inn_numb_nodes,sizeof(int),1,write_ptr);
123+
convert_data(&global_inn_numb_nodes,sizeof(int),1);
124+
125+
convert_data(&g->number_input,sizeof(int),1);
126+
fwrite(&g->number_input,sizeof(int),1,write_ptr);
127+
convert_data(&g->number_input,sizeof(int),1);
128+
convert_data(&g->number_output,sizeof(int),1);
129+
fwrite(&g->number_output,sizeof(int),1,write_ptr);
130+
convert_data(&g->number_output,sizeof(int),1);
131+
convert_data(&g->number_total_nodes,sizeof(int),1);
132+
fwrite(&g->number_total_nodes,sizeof(int),1,write_ptr);
133+
convert_data(&g->number_total_nodes,sizeof(int),1);
134+
convert_data(&g->fitness,sizeof(float),1);
135+
fwrite(&g->fitness,sizeof(float),1,write_ptr);
136+
convert_data(&g->fitness,sizeof(float),1);
137+
138+
for(i = 0; i < g->number_total_nodes; i++){
139+
convert_data(&g->all_nodes[i]->in_conn_size,sizeof(int),1);
140+
fwrite(&g->all_nodes[i]->in_conn_size,sizeof(int),1,write_ptr);
141+
convert_data(&g->all_nodes[i]->in_conn_size,sizeof(int),1);
142+
convert_data(&g->all_nodes[i]->out_conn_size,sizeof(int),1);
143+
fwrite(&g->all_nodes[i]->out_conn_size,sizeof(int),1,write_ptr);
144+
convert_data(&g->all_nodes[i]->out_conn_size,sizeof(int),1);
145+
convert_data(&g->all_nodes[i]->innovation_number,sizeof(int),1);
146+
fwrite(&g->all_nodes[i]->innovation_number,sizeof(int),1,write_ptr);
147+
convert_data(&g->all_nodes[i]->innovation_number,sizeof(int),1);
148+
}
149+
convert_data(&n,sizeof(int),1);
150+
fwrite(&n,sizeof(int),1,write_ptr);
151+
convert_data(&n,sizeof(int),1);
152+
153+
for(i = 0; i < n; i++){
154+
convert_data(&c[i]->innovation_number,sizeof(int),1);
155+
fwrite(&c[i]->innovation_number,sizeof(int),1,write_ptr);
156+
convert_data(&c[i]->innovation_number,sizeof(int),1);
157+
convert_data(&c[i]->in_node->innovation_number,sizeof(int),1);
158+
fwrite(&c[i]->in_node->innovation_number,sizeof(int),1,write_ptr);
159+
convert_data(&c[i]->in_node->innovation_number,sizeof(int),1);
160+
convert_data(&c[i]->out_node->innovation_number,sizeof(int),1);
161+
fwrite(&c[i]->out_node->innovation_number,sizeof(int),1,write_ptr);
162+
convert_data(&c[i]->out_node->innovation_number,sizeof(int),1);
163+
convert_data(&c[i]->weight,sizeof(float),1);
164+
fwrite(&c[i]->weight,sizeof(float),1,write_ptr);
165+
convert_data(&c[i]->weight,sizeof(float),1);
166+
convert_data(&c[i]->flag,sizeof(int),1);
167+
fwrite(&c[i]->flag,sizeof(int),1,write_ptr);
168+
convert_data(&c[i]->flag,sizeof(int),1);
169+
}
170+
171+
free(c);
172+
i = fclose(write_ptr);
173+
174+
return i;
175+
176+
}
177+
104178
char* get_genome_array(genome* g, int global_inn_numb_connections){
105179
int i,n, sum=0;
106180
connection** cc = get_connections(g,global_inn_numb_connections);
@@ -396,6 +470,132 @@ genome* load_genome(int global_inn_numb_connections, char* filename){
396470
return g;
397471

398472

473+
}
474+
475+
int get_global_innovation_number_connections_from_genome(genome* g){
476+
return g->global_inn_numb_connections;
477+
}
478+
int get_global_innovation_number_nodes_from_genome(genome* g){
479+
return g->global_inn_numb_nodes;
480+
}
481+
482+
genome* load_genome_complete(char* filename){
483+
int i,j,n,inn,inn2,k;
484+
char input[256];
485+
FILE *read_ptr = fopen(filename,"r");
486+
if(read_ptr == NULL){
487+
fprintf(stderr,"Error no such a file\n");
488+
exit(1);
489+
}
490+
491+
int global_inn_numb_connections,global_inn_numb_nodes;
492+
k = fread(&global_inn_numb_connections,sizeof(int),1,read_ptr);
493+
convert_data(&global_inn_numb_connections,sizeof(int),1);
494+
k = fread(&global_inn_numb_nodes,sizeof(int),1,read_ptr);
495+
convert_data(&global_inn_numb_nodes,sizeof(int),1);
496+
497+
498+
connection** c = (connection**)malloc(sizeof(connection*)*global_inn_numb_connections);
499+
for(i = 0; i < global_inn_numb_connections; i++){
500+
c[i] = NULL;
501+
}
502+
genome* g = (genome*)malloc(sizeof(genome));
503+
504+
k = fread(&g->number_input,sizeof(int),1,read_ptr);
505+
convert_data(&g->number_input,sizeof(int),1);
506+
k = fread(&g->number_output,sizeof(int),1,read_ptr);
507+
convert_data(&g->number_output,sizeof(int),1);
508+
k = fread(&g->number_total_nodes,sizeof(int),1,read_ptr);
509+
convert_data(&g->number_total_nodes,sizeof(int),1);
510+
k = fread(&g->fitness,sizeof(float),1,read_ptr);
511+
convert_data(&g->fitness,sizeof(float),1);
512+
g->all_nodes = (node**)malloc(sizeof(node*)*g->number_total_nodes);
513+
514+
for(i = 0; i < g->number_total_nodes; i++){
515+
g->all_nodes[i] = (node*)malloc(sizeof(node));
516+
k = fread(&g->all_nodes[i]->in_conn_size,sizeof(int),1,read_ptr);
517+
convert_data(&g->all_nodes[i]->in_conn_size,sizeof(int),1);
518+
k = fread(&g->all_nodes[i]->out_conn_size,sizeof(int),1,read_ptr);
519+
convert_data(&g->all_nodes[i]->out_conn_size,sizeof(int),1);
520+
k = fread(&g->all_nodes[i]->innovation_number,sizeof(int),1,read_ptr);
521+
convert_data(&g->all_nodes[i]->innovation_number,sizeof(int),1);
522+
g->all_nodes[i]->actual_value = 0;
523+
g->all_nodes[i]->stored_value = 0;
524+
g->all_nodes[i]->in_connections = (connection**)malloc(sizeof(connection*)*g->all_nodes[i]->in_conn_size);
525+
g->all_nodes[i]->out_connections = (connection**)malloc(sizeof(connection*)*g->all_nodes[i]->out_conn_size);
526+
}
527+
528+
k = fread(&n,sizeof(int),1,read_ptr);
529+
convert_data(&n,sizeof(int),1);
530+
for(i = 0; i < n; i++){
531+
k = fread(&inn,sizeof(int),1,read_ptr);
532+
convert_data(&inn,sizeof(int),1);
533+
free(c[inn-1]);
534+
c[inn-1] = (connection*)malloc(sizeof(connection));
535+
c[inn-1]->innovation_number = inn;
536+
k = fread(&inn2,sizeof(int),1,read_ptr);
537+
convert_data(&inn2,sizeof(int),1);
538+
for(j = 0; j < g->number_total_nodes; j++){
539+
if(g->all_nodes[j]->innovation_number == inn2){
540+
c[inn-1]->in_node = g->all_nodes[j];
541+
break;
542+
}
543+
}
544+
k = fread(&inn2,sizeof(int),1,read_ptr);
545+
convert_data(&inn2,sizeof(int),1);
546+
for(j = 0; j < g->number_total_nodes; j++){
547+
if(g->all_nodes[j]->innovation_number == inn2){
548+
c[inn-1]->out_node = g->all_nodes[j];
549+
break;
550+
}
551+
}
552+
553+
k = fread(&c[inn-1]->weight,sizeof(float),1,read_ptr);
554+
convert_data(&c[inn-1]->weight,sizeof(float),1);
555+
k = fread(&c[inn-1]->flag,sizeof(int),1,read_ptr);
556+
convert_data(&c[inn-1]->flag,sizeof(int),1);
557+
}
558+
559+
for(i = 0; i < g->number_total_nodes; i++){
560+
inn = 0;
561+
inn2 = 0;
562+
for(j = 0; j < global_inn_numb_connections; j++){
563+
if(c[j]!=NULL){
564+
if(c[j]->in_node->innovation_number == g->all_nodes[i]->innovation_number){
565+
g->all_nodes[i]->out_connections[inn] = c[j];
566+
inn++;
567+
}
568+
if(c[j]->out_node->innovation_number == g->all_nodes[i]->innovation_number){
569+
570+
g->all_nodes[i]->in_connections[inn2] = c[j];
571+
inn2++;
572+
}
573+
574+
}
575+
}
576+
577+
578+
}
579+
580+
for(j = 0; j < global_inn_numb_connections; j++){
581+
if(c[j] == NULL)
582+
free(c[j]);
583+
}
584+
585+
free(c);
586+
587+
i = fclose(read_ptr);
588+
589+
590+
if(i == EOF){
591+
printf("error closing the file, the process will end\n");
592+
exit(1);
593+
}
594+
g->global_inn_numb_connections = global_inn_numb_connections;
595+
g->global_inn_numb_nodes = global_inn_numb_nodes;
596+
return g;
597+
598+
399599
}
400600

401601
float random_float_number(float a){

0 commit comments

Comments
 (0)