@@ -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+
104178char * 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
401601float random_float_number (float a ){
0 commit comments