@@ -101,6 +101,80 @@ int save_genome(genome* g, int global_inn_numb_connections, int numb){
101
101
102
102
}
103
103
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
+
104
178
char * get_genome_array (genome * g , int global_inn_numb_connections ){
105
179
int i ,n , sum = 0 ;
106
180
connection * * cc = get_connections (g ,global_inn_numb_connections );
@@ -396,6 +470,132 @@ genome* load_genome(int global_inn_numb_connections, char* filename){
396
470
return g ;
397
471
398
472
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
+
399
599
}
400
600
401
601
float random_float_number (float a ){
0 commit comments