From ea26f5f3bce391133b6b81bdbeeae5298a1d1400 Mon Sep 17 00:00:00 2001 From: fanasina Date: Sun, 16 Nov 2025 00:01:16 +0100 Subject: [PATCH] y_nnn: WORK IN PROGRESS... have to save --- .../src/deepQlearning/learn_to_drive.c | 17 +- .../src/deepQlearning/learn_to_drive.h | 7 + .../include/y_net_neur_net/y_nnn_manager.h | 1 + .../y_net_neur_net/y_nnn_screen_manager.h | 4 +- .../src/y_net_neur_net/y_nnn_manager.c | 59 +- .../src/y_net_neur_net/y_nnn_screen_manager.c | 23 +- y_network_neural_network_/test/Makefile | 2 +- y_network_neural_network_/test/is_good.c | 2640 ++++++++++++++++- ytest_t/include_ytest/include/ftest/ftest.h | 10 + 9 files changed, 2747 insertions(+), 16 deletions(-) diff --git a/deepQlearn_0/src/deepQlearning/learn_to_drive.c b/deepQlearn_0/src/deepQlearning/learn_to_drive.c index a135b1e..220a962 100644 --- a/deepQlearn_0/src/deepQlearning/learn_to_drive.c +++ b/deepQlearn_0/src/deepQlearning/learn_to_drive.c @@ -387,9 +387,12 @@ char *fileNameDateScore(char * pre, char* post,size_t score){ return filename; } +const char* target_symlink = ".ff_target_.symlink"; +const char* main_symlink = ".ff_main_.symlink"; void learn_to_drive(struct RL_agent * rlAgent){ + printf("debug: start learn_to_drive\n"); int action; struct vehicle * car = rlAgent->car; struct game_status * car_status = car->status; @@ -402,7 +405,7 @@ void learn_to_drive(struct RL_agent * rlAgent){ ////pthread_create(&threadPrint, NULL, runPrint, (void*)rlAgent); // while(true){ - for(size_t index_episode = 0; index_episode < qlParams->number_episodes; ++index_episode){ + for(size_t index_episode = 0; (!is_ending(qlStatus)) && (index_episode < qlParams->number_episodes) ; ++index_episode){ reset(car); qlStatus->nb_training_after_updated_weight_in_target = 0; qlStatus->index_episode = index_episode; @@ -427,9 +430,21 @@ void learn_to_drive(struct RL_agent * rlAgent){ push_back_list_TYPE_L_INT(qlStatus->progress_best_cumul, car_status->cumulative_reward); char *file = fileNameDateScore(".ff_main_",".txt",car_status->cumulative_reward); EXPORT_TO_FILE_TENSOR_ATTRIBUTE_IN_NNEURONS(TYPE_FLOAT, rlAgent->networks->main_net ,weight_in, file); + unlink(main_symlink); + if(symlink(file, main_symlink)==-1){ + fprintf(stderr,"debug: symlink %s with %s.\n",main_symlink, file); + //fprintf(stderr,"debug: symlink %s with %s. explain:%s \n",main_symlink, file, explain_symlink(file, main_symlink) ); + } + else write(1,":",1); free(file); file = fileNameDateScore(".ff_target_",".txt",car_status->cumulative_reward); EXPORT_TO_FILE_TENSOR_ATTRIBUTE_IN_NNEURONS(TYPE_FLOAT, rlAgent->networks->target_net ,weight_in, file); + unlink(target_symlink); + if(symlink(file, target_symlink)==-1){ + fprintf(stderr,"debug: symlink %s with %s\n",target_symlink,file ); + //fprintf(stderr,"debug: symlink %s with %s explain:%s\n",target_symlink,file,explain_symlink(file, target_symlink) ); + } + else write(1,"-",1); free(file); } break; diff --git a/deepQlearn_0/src/deepQlearning/learn_to_drive.h b/deepQlearn_0/src/deepQlearning/learn_to_drive.h index 27461a8..ce2d65d 100644 --- a/deepQlearn_0/src/deepQlearning/learn_to_drive.h +++ b/deepQlearn_0/src/deepQlearning/learn_to_drive.h @@ -25,6 +25,13 @@ //float d_reLU(float x); +// to debug symlink error!: have to instal libexplain-dev (apt install), +// and add -lexplain in cflag (or in compile flag) +//#include + +//#define target_symlink ".ff_target_.symlink" +//#define main_symlink ".ff_main_.symlink" + extern char *action_name[8]; struct qlearning_params { diff --git a/y_network_neural_network_/include/y_net_neur_net/y_nnn_manager.h b/y_network_neural_network_/include/y_net_neur_net/y_nnn_manager.h index 3e0eed5..1f6cd7f 100644 --- a/y_network_neural_network_/include/y_net_neur_net/y_nnn_manager.h +++ b/y_network_neural_network_/include/y_net_neur_net/y_nnn_manager.h @@ -2,6 +2,7 @@ #ifndef Y_NETWORK_NEURAL_NETWORK__MANAGER__H_C #define Y_NETWORK_NEURAL_NETWORK__MANAGER__H_C +#include #include #include "learn_to_drive.h" diff --git a/y_network_neural_network_/include/y_net_neur_net/y_nnn_screen_manager.h b/y_network_neural_network_/include/y_net_neur_net/y_nnn_screen_manager.h index dfb5bcc..0d8e16f 100644 --- a/y_network_neural_network_/include/y_net_neur_net/y_nnn_screen_manager.h +++ b/y_network_neural_network_/include/y_net_neur_net/y_nnn_screen_manager.h @@ -51,7 +51,9 @@ struct arg_bash{ int fd_old_bash_pid; int fd_new_bash_pid; int fd_current_bash_pid; - + + pthread_t *thread_launch; + pthread_mutex_t *mut_bash_var; pthread_cond_t *cond_bash_var; int go_on; diff --git a/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c b/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c index 6360950..eb5a904 100644 --- a/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c +++ b/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c @@ -19,9 +19,12 @@ void free_arg_run_qlearn_bprint(struct arg_run_qlearn_bprint *arg){ free(arg); } +void* run_sleep_wait_bash_and_print(void *arg); + void y_nnn_manager_handle_input(char * buf, int len_buf, void *arg){ - struct arg_run_qlearn_bprint *run_arg=(struct arg_run_bash_print*)arg; + struct arg_run_qlearn_bprint *run_arg=(struct arg_run_qlearn_bprint*)arg; struct arg_bash *bash_arg=run_arg->bash_arg; + struct RL_agent *rlAgent = run_arg->rlAgent; if(arg && (len_buf>0)){ @@ -32,6 +35,27 @@ void y_nnn_manager_handle_input(char * buf, int len_buf, void *arg){ launch_sleep_wait_bash(bash_arg); }else if(strncmp(buf,"killbash",8)==0){ kill_all_bash(bash_arg); + }else if(strncmp(buf,"stoplearn",9)==0){ + pthread_mutex_lock(rlAgent->status->mut_ending); + rlAgent->status->ending=1; + pthread_mutex_unlock(rlAgent->status->mut_ending); + + kill_all_bash(bash_arg); + }else if(strncmp(buf,"startprintnewbash",17)==0){ + run_newbash(bash_arg); + pthread_t thread_run; + pthread_create(&thread_run, NULL, runBashPrint, arg); + //Sleep(2); + + }else if(strncmp(buf,"startprintwaitbash",18)==0){ + + pthread_t thread_run; + pthread_create(&thread_run, NULL, run_sleep_wait_bash_and_print, arg); + + }else if(strncmp(buf,"stopprintbash",13)==0){ + pthread_mutex_lock(bash_arg->mut_bash_var); + bash_arg->go_on=0; + pthread_mutex_unlock(bash_arg->mut_bash_var); }else{ printf("debug: %s is not handle\n",buf); } @@ -40,10 +64,29 @@ void y_nnn_manager_handle_input(char * buf, int len_buf, void *arg){ } +void* run_sleep_wait_bash_and_print(void *arg){ + struct arg_run_qlearn_bprint *arg_run=(struct arg_run_qlearn_bprint*)arg; + //struct RL_agent *rlAgent = arg_run->rlAgent; + struct arg_bash *bash_arg = arg_run->bash_arg; + wait_sleep_newbash(bash_arg); + return runBashPrint(arg); +} +void wait_valid_pid_bash(struct arg_bash *bash_arg){ + pthread_mutex_lock(bash_arg->mut_bash_var); + while( + (bash_arg->fd_new_bash_pid == -1) && + (bash_arg->fd_current_bash_pid == -1) + ){ + printf("debug: wait new bash!\n"); + pthread_cond_wait(bash_arg->cond_bash_var, bash_arg->mut_bash_var); + } + pthread_mutex_unlock(bash_arg->mut_bash_var); + +} void* runBashPrint(void *arg){ - struct arg_run_bash_print *arg_run=(struct arg_run_bash_print*)arg; + struct arg_run_qlearn_bprint *arg_run=(struct arg_run_qlearn_bprint*)arg; struct RL_agent *rlAgent = arg_run->rlAgent; struct arg_bash *bash_arg = arg_run->bash_arg; @@ -53,6 +96,10 @@ void* runBashPrint(void *arg){ size_t count_print = 0; char buf[SIZE_LOCAL_BUF]; int len_buf; + + wait_valid_pid_bash(bash_arg); + + printf("debug: start runBashPrint in episode: %ld\n",qlStatus->index_episode); while((new_bash_exist(bash_arg)) && check_go_on_print_params(pprint) && !is_ending(qlStatus)){ if(/*(qlStatus->nb_episodes %125 == 0) &&*/ pprint->printed){ //pthread_mutex_lock(&(pprint->mut_printed)); @@ -64,7 +111,7 @@ void* runBashPrint(void *arg){ len_buf=sprintf(buf,"%s ",pprint->string_space); BASH_WRITE_IF_EXIST(bash_arg, buf, len_buf) - ////printf("ep: %ld\n",qlStatus->index_episode); + ////printf("ep: %ld ",qlStatus->index_episode); len_buf=sprintf(buf,"ep: %ld\n",qlStatus->index_episode); BASH_WRITE_IF_EXIST(bash_arg, buf, len_buf) neurons_TYPE_FLOAT * net_main = rlAgent->networks->main_net; @@ -104,5 +151,11 @@ void* runBashPrint(void *arg){ clear_screen(); } } + printf("debug: end runBashPrint\n"); return NULL; } + +// 0 if filename it exists +int file_exists(char *filename){ + return access(filename, F_OK); +} diff --git a/y_network_neural_network_/src/y_net_neur_net/y_nnn_screen_manager.c b/y_network_neural_network_/src/y_net_neur_net/y_nnn_screen_manager.c index 38d07c1..1d21608 100644 --- a/y_network_neural_network_/src/y_net_neur_net/y_nnn_screen_manager.c +++ b/y_network_neural_network_/src/y_net_neur_net/y_nnn_screen_manager.c @@ -109,6 +109,7 @@ struct arg_bash *create_arg_bash(){ pthread_cond_init(b_arg->cond_bash_var,NULL); b_arg->go_on=1; + b_arg->thread_launch=NULL; return b_arg; } @@ -130,11 +131,16 @@ void free_arg_bash(struct arg_bash *arg){ kill(arg->current_bash_pid, SIGKILL); } + if(arg->thread_launch){ + pthread_join(*(arg->thread_launch), NULL); + free(arg->thread_launch); + } + free(arg); } int new_bash_exist(struct arg_bash *bash_arg){ - return ((bash_arg->fd_new_bash_pid>0) || (bash_arg->fd_current_bash_pid)); + return ((bash_arg->fd_new_bash_pid>0) || (bash_arg->fd_current_bash_pid>0)); } /* run new bash terminal graphic, can be called directly or in a thread */ @@ -153,14 +159,23 @@ if(arg->new_bash_pid == arg->old_bash_pid){ }else{ wait(NULL); + usleep(20000); + pthread_mutex_lock(arg->mut_bash_var); - arg->new_bash_pid=pidof("bash",NULL); - if(arg->new_bash_pid > arg->old_bash_pid){ + arg->new_bash_pid = pidof("bash",NULL); + arg->fd_new_bash_pid = open_duplicate_bash(arg->new_bash_pid); + while(arg->new_bash_pid == arg->old_bash_pid) + { + printf("debug: create new terminal: %d vs %d\n",arg->new_bash_pid,arg->old_bash_pid); + getchar(); + arg->new_bash_pid = pidof("bash",NULL); arg->fd_new_bash_pid = open_duplicate_bash(arg->new_bash_pid); - printf("runnewbash: ready\n"); + //usleep(2000); } + pthread_mutex_unlock(arg->mut_bash_var); pthread_cond_signal(arg->cond_bash_var); + printf("debug: send signal run_newbash\n"); } } diff --git a/y_network_neural_network_/test/Makefile b/y_network_neural_network_/test/Makefile index 8649bc6..6ccafb0 100644 --- a/y_network_neural_network_/test/Makefile +++ b/y_network_neural_network_/test/Makefile @@ -127,7 +127,7 @@ DEPLIBS=$(NETNEURNETDIR) $(YTESTDIR) $(YSOCKET_DIR) $(DEEPQLEARNDIR) INCLUDE=$(INCLUDE_NNN) $(INCLUDE_SOCKET) $(INCLUDE_DEEPQLEARN) -CFLAGS=-Wall -lOpenCL -lm -lpthread -Werror -fpic $(INCLUDE) #-lcurses +CFLAGS=-Wall -lOpenCL -lm -lpthread -Werror -fpic $(INCLUDE) #-lcurses -lexplain #LDFLAGS=-L$(YTESTDIR) -lytest -lOpenCL -lm -lpthread #-lcurses diff --git a/y_network_neural_network_/test/is_good.c b/y_network_neural_network_/test/is_good.c index ca2981a..01b4a5f 100644 --- a/y_network_neural_network_/test/is_good.c +++ b/y_network_neural_network_/test/is_good.c @@ -13,11 +13,23 @@ #include "ftest/ftest_array.h" #include "fmock/fmock.h" +#include "neuron_t/neuron_t.h" + +#include "vehicle.h" +#include "learn_to_drive.h" + #include "y_net_neur_net/y_nnn_manager.h" #include "y_net_neur_net/y_nnn_screen_manager.h" -TEST(pidof_bash){ +#include + + + +//#include "permutation_t/permutation_t.h" + + +HIDE_TEST(pidof_bash){ struct arg_bash *arg= create_arg_bash(); launch_new_bash((void*)arg); @@ -42,7 +54,7 @@ TEST(pidof_bash){ } -TEST(wait_bash){ +HIDE_TEST(wait_bash){ struct arg_bash *arg= create_arg_bash(); launch_wait_bash((void*)arg); @@ -68,7 +80,7 @@ TEST(wait_bash){ } -TEST(new_and_wait_bash){ +HIDE_TEST(new_and_wait_bash){ struct arg_bash *arg= create_arg_bash(); run_newbash((void*)arg); pthread_t th; @@ -107,7 +119,7 @@ TEST(new_and_wait_bash){ } -TEST(sleep_wait_bash){ +HIDE_TEST(sleep_wait_bash){ struct arg_bash *arg= create_arg_bash(); launch_sleep_wait_bash((void*)arg); @@ -132,7 +144,7 @@ TEST(sleep_wait_bash){ } -TEST(new_or_wait_bash){ +HIDE_TEST(new_or_wait_bash){ struct arg_bash *arg= create_arg_bash(); pthread_t th; pthread_create(&th, NULL, wait_sleep_newbash, ((void*)arg)); @@ -242,10 +254,2626 @@ TEST(try_y_socket_manager){ } #endif + +TEST(){ + +} + + + + + + + + + + +float f(float x){ + return 1/(1+exp((double)(-x))); +} + +float df(float x){ + return exp(-x)/ ((1+exp(-x)) * (1+exp(-x))); +} + +// ************************************************************** + +#if 1 +TEST(first_learn_vehicle_50__9){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.00001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 50000 /*size_t delay_between_episodes*/, + 500/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.01/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + struct arg_bash *bash_arg= create_arg_bash(); + + struct arg_run_qlearn_bprint *argQL_BP = create_arg_run_qlearn_bprint(bash_arg, rlAgent); + + struct arg_var_ * var = create_arg_var_(y_nnn_manager_handle_input, argQL_BP); + struct y_socket_t *argS = y_socket_create("1600", 2, 3, var); + + pthread_t pollTh; + pthread_create(&pollTh, NULL, y_socket_poll_fds, (void*)argS); + + + + + learn_to_drive(rlAgent); + + + + pthread_join(pollTh, NULL); + + y_socket_free(argS); + free_arg_var_(var); + free_arg_run_qlearn_bprint(argQL_BP); + //free_arg_bash(bash_arg); + //free_RL_agent(rlAgent); + +} +#endif + + + +// **************************************************************** + +#if 1 +HIDE_TEST(first_learn_vehicle_50__10){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.00001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); +*/ + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.0001/*0.99*/ /*float exploration_factor*/, +20/*long int nb_training_before_update_weight_in_target*/, +1 /*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ +); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle_50__11){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + + +copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0; /* 0.000001*/ /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_17h50m56s_26300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_17h50m56s_26300.txt"); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_23h02m40s_29000.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_23h02m40s_29000.txt"); +*/ +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.0001/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle_50__12){ + size_t nb_block = 10; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + + copy_coordinate(path->lower_bound_block[9], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[9], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[0], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[1], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[2], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[2], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[3], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[4], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,150}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){120,150}); + copy_coordinate(path->upper_bound_block[6], (float[]){300,210}); + copy_coordinate(path->lower_bound_block[7], (float[]){120,210}); + copy_coordinate(path->upper_bound_block[7], (float[]){270,350}); + copy_coordinate(path->lower_bound_block[8], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[8], (float[]){120,350}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + + +copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.0000001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + +//print_vehicle_n_path(car, 12, 12); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); +*/ +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_17h50m56s_26300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_17h50m56s_26300.txt"); + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.1/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 1/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + + + + +#if 1 +HIDE_TEST(first_learn_vehicle13){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + + +#if 0 +HIDE_TEST(first_learn_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + +#if 0 + int main(int argc, char **argv){ run_all_tests_args(argc, argv); - return 0; +return 0; +} + + +#include +#include +#include + +#include + +// for sleep ! +/* +#ifdef __linux__ + #include +#elif _WIN32 + #include +#endif +*/ + +#include "ftest/ftest.h" +#include "ftest/ftest_array.h" +#include "fmock/fmock.h" + + +//#include "permutation_t/permutation_t.h" +#include "neuron_t/neuron_t.h" + +#include "vehicle.h" +#include "learn_to_drive.h" + +#endif + +HIDE_TEST(create_coordenate){ + coordinate * coord = create_coordinate(3); + coord->x[0]=0; + coord->x[1]=1.2; + coord->x[0]=0.8; + + free_coordinate(coord); +} + +HIDE_TEST(create_blocks){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * zn = create_blocks(nb_block, dim); + + for(size_t i=0; ilower_bound_block[i]->x[j] = 0; + zn->upper_bound_block[i]->x[j] = (i+1)*(j+1); + } + } + + + for(size_t i=0; ilower_bound_block[i]->x[j]); + LOG("%s",")\\ ("); + for(size_t j=0; jupper_bound_block[i]->x[j]); + LOG("%s",")"); + + } + LOG("\n"); + + free_blocks(zn); + +} + +HIDE_TEST(is_in_blocks){ + size_t nb_block = 3; + size_t dim= 2; + struct blocks * zn = create_blocks(nb_block, dim); + + copy_coordinate(zn->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(zn->upper_bound_block[0], (float[]){2,2}); + copy_coordinate(zn->lower_bound_block[1], (float[]){2,0}); + copy_coordinate(zn->upper_bound_block[1], (float[]){4,4}); + copy_coordinate(zn->lower_bound_block[2], (float[]){0,4}); + copy_coordinate(zn->upper_bound_block[2], (float[]){6,7}); + + coordinate *coord = create_coordinate(2); + + copy_coordinate(coord, (float[]){1,1}); + EXPECT_TRUE(is_in_blocks(zn, coord)); + + copy_coordinate(coord, (float[]){1,5}); + EXPECT_TRUE(is_in_blocks(zn, coord)); + + copy_coordinate(coord, (float[]){3,3}); + EXPECT_TRUE(is_in_blocks(zn, coord)); + + copy_coordinate(coord, (float[]){1,3}); + EXPECT_FALSE(is_in_blocks(zn, coord)); + + print2D_blocks(zn,0.4,0.6, '.'); + + + free_blocks(zn); + free_coordinate(coord); + + +} + + +HIDE_TEST(print_blocks_withPoint){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * zn = create_blocks(nb_block, dim); + +/* + copy_coordinate(zn->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(zn->upper_bound_block[0], (float[]){8,2}); + copy_coordinate(zn->lower_bound_block[1], (float[]){8,0}); + copy_coordinate(zn->upper_bound_block[1], (float[]){12,4}); + copy_coordinate(zn->lower_bound_block[2], (float[]){0,4}); + copy_coordinate(zn->upper_bound_block[2], (float[]){14,7}); + copy_coordinate(zn->lower_bound_block[3], (float[]){15,2}); + copy_coordinate(zn->upper_bound_block[3], (float[]){18,7}); + */ + + copy_coordinate(zn->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(zn->upper_bound_block[0], (float[]){2,7}); + copy_coordinate(zn->lower_bound_block[1], (float[]){2,0}); + copy_coordinate(zn->upper_bound_block[1], (float[]){4,2}); + copy_coordinate(zn->lower_bound_block[2], (float[]){4,1}); + copy_coordinate(zn->upper_bound_block[2], (float[]){8,3}); + copy_coordinate(zn->lower_bound_block[3], (float[]){8,0}); + copy_coordinate(zn->upper_bound_block[3], (float[]){16,2}); + copy_coordinate(zn->lower_bound_block[4], (float[]){16,0}); + copy_coordinate(zn->upper_bound_block[4], (float[]){18,7}); + copy_coordinate(zn->lower_bound_block[5], (float[]){6,7}); + copy_coordinate(zn->upper_bound_block[5], (float[]){18,9}); + copy_coordinate(zn->lower_bound_block[6], (float[]){2,6}); + copy_coordinate(zn->upper_bound_block[6], (float[]){6,8}); + + + coordinate *coord = create_coordinate(2); + + copy_coordinate(coord, (float[]){1,1}); + EXPECT_TRUE(is_in_blocks(zn, coord)); + + print2D_blocks_withPoint(zn,0.24,0.48, '#',coord); + //print2D_blocks(zn,0.14,0.28, '#'); + + copy_coordinate(coord, (float[]){1,5}); + EXPECT_TRUE(is_in_blocks(zn, coord)); +// print2D_blocks_withPoint(zn,0.24,0.48, '#',coord); + + copy_coordinate(coord, (float[]){2,3}); + EXPECT_TRUE(is_in_blocks(zn, coord)); +// print2D_blocks_withPoint(zn,0.24,0.48, '#',coord); + + copy_coordinate(coord, (float[]){7,5}); + EXPECT_FALSE(is_in_blocks(zn, coord)); + + + + free_blocks(zn); + free_coordinate(coord); + + +} + +#if 0 + +HIDE_TEST(first_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){2,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){2,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){4,2}); + copy_coordinate(path->lower_bound_block[2], (float[]){4,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){8,3}); + copy_coordinate(path->lower_bound_block[3], (float[]){8,0}); + copy_coordinate(path->upper_bound_block[3], (float[]){16,2}); + copy_coordinate(path->lower_bound_block[4], (float[]){16,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[5], (float[]){6,7}); + copy_coordinate(path->upper_bound_block[5], (float[]){18,9}); + copy_coordinate(path->lower_bound_block[6], (float[]){2,6}); + copy_coordinate(path->upper_bound_block[6], (float[]){6,8}); + + update_bounds_limits_blocks(path); + + struct vehicle *vhcl = create_vehicle(path); + + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + free_vehicle(vhcl); + + +} + +#endif + +HIDE_TEST(circle_path_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + update_bounds_limits_blocks(path); + + struct vehicle *vhcl = create_vehicle(path); + + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + free_vehicle(vhcl); + + +} + +HIDE_TEST(circle_path_vehicle_00){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + update_bounds_limits_blocks(path); + + struct vehicle *vhcl = create_vehicle(path); + + print_vehicle_n_path(vhcl, 20,40); + + step_vehicle(vhcl, CENTER); + Sleep(200); +/* print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); +*/ + free_vehicle(vhcl); + + +} + + + +HIDE_TEST(circle_path_vehicle_50){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); +#if 1 + copy_coordinate(path->lower_bound_block[6], (float[]){0,30}); + copy_coordinate(path->upper_bound_block[6], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[5], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[5], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[4], (float[]){250,20}); + copy_coordinate(path->upper_bound_block[4], (float[]){360,120}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,80}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[2], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[1], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[1], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[0], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[0], (float[]){410,300}); + + +#else + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + +copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *vhcl = create_vehicle(path); + + print_vehicle_n_path(vhcl, 10,10); + + step_vehicle(vhcl, CENTER); + Sleep(200); +/* print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); + + step_vehicle(vhcl, CENTER); + Sleep(200); + print_vehicle_n_path(vhcl, 0.2,0.4); +*/ + free_vehicle(vhcl); + + +} + +HIDE_TEST(reward_list){ + struct status_qlearning * l_reward = create_status_qlearning(); + + free_status_qlearning(l_reward); +} + +#if 0 +float f(float x){ + return 1/(1+exp((double)(-x))); +} + +float df(float x){ + return exp(-x)/ ((1+exp(-x)) * (1+exp(-x))); +} +#endif + +#if 1 +HIDE_TEST(first_learn_vehicle_rev50_8){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 0 + copy_coordinate(path->lower_bound_block[6], (float[]){0,30}); + copy_coordinate(path->upper_bound_block[6], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[5], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[5], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[4], (float[]){250,20}); + copy_coordinate(path->upper_bound_block[4], (float[]){360,120}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,80}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[2], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[1], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[1], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[0], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[0], (float[]){410,300}); + +#else + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[5], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[5], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[6], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[6], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[0], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[0], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[1], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[1], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[2], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[3], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[3], (float[]){410,300}); + + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.001; // 0.00001 /*0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.99, // 0.0001 /* 0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); +char c; +scanf("%c",&c); + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + +// ************************************************************** + +#if 1 +HIDE_TEST(first_learn_vehicle_50__9){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.00001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +//EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 50000 /*size_t delay_between_episodes*/, + 500/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.01/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +// **************************************************************** + +#if 1 +HIDE_TEST(first_learn_vehicle_50__10){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.00001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); +*/ + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.0001/*0.99*/ /*float exploration_factor*/, +20/*long int nb_training_before_update_weight_in_target*/, +1 /*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ +); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle_50__11){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + + +copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0; /* 0.000001*/ /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_01h42m16s_5300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_01h42m16s_5300.txt"); +*/ + +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_17h50m56s_26300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_17h50m56s_26300.txt"); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_23h02m40s_29000.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_23h02m40s_29000.txt"); +*/ +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.0001/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle_50__12){ + size_t nb_block = 10; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + +#if 1 + + copy_coordinate(path->lower_bound_block[9], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[9], (float[]){100,250}); + copy_coordinate(path->lower_bound_block[0], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){250,80}); + copy_coordinate(path->lower_bound_block[1], (float[]){250,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){360,140}); + copy_coordinate(path->lower_bound_block[2], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[2], (float[]){600,140}); + copy_coordinate(path->lower_bound_block[3], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[3], (float[]){720,300}); + copy_coordinate(path->lower_bound_block[4], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[4], (float[]){720,350}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,150}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){120,150}); + copy_coordinate(path->upper_bound_block[6], (float[]){300,210}); + copy_coordinate(path->lower_bound_block[7], (float[]){120,210}); + copy_coordinate(path->upper_bound_block[7], (float[]){270,350}); + copy_coordinate(path->lower_bound_block[8], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[8], (float[]){120,350}); + + + +/* + + copy_coordinate(path->lower_bound_block[4], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[4], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[3], (float[]){150,40}); + copy_coordinate(path->upper_bound_block[3], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[1], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[1], (float[]){600,150}); + copy_coordinate(path->lower_bound_block[0], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[0], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[6], (float[]){260,300}); + copy_coordinate(path->upper_bound_block[6], (float[]){760,360}); + copy_coordinate(path->lower_bound_block[5], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[5], (float[]){410,300}); + + + + +copy_coordinate(path->lower_bound_block[0], (float[]){0,0}); + copy_coordinate(path->upper_bound_block[0], (float[]){150,250}); + copy_coordinate(path->lower_bound_block[1], (float[]){150,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){250,150}); + copy_coordinate(path->lower_bound_block[2], (float[]){250,80}); + copy_coordinate(path->upper_bound_block[2], (float[]){360,200}); + copy_coordinate(path->lower_bound_block[3], (float[]){360,70}); + copy_coordinate(path->upper_bound_block[3], (float[]){600,170}); + copy_coordinate(path->lower_bound_block[4], (float[]){600,90}); + copy_coordinate(path->upper_bound_block[4], (float[]){760,300}); + copy_coordinate(path->lower_bound_block[5], (float[]){300,300}); + copy_coordinate(path->upper_bound_block[5], (float[]){760,350}); + copy_coordinate(path->lower_bound_block[6], (float[]){0,250}); + copy_coordinate(path->upper_bound_block[6], (float[]){410,300}); + + + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + */ + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 500; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.0000001 /* 0.001*/; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + +//print_vehicle_n_path(car, 12, 12); +/* +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20240717_09h11m09s_1700.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20240717_09h11m09s_1700.txt"); +*/ +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->main_net, weight_in, ".ff_main_20250508_17h50m56s_26300.txt"); +EXTRACT_FILE_TO_TENSOR_ATTRIBUTE_NNEURONS(TYPE_FLOAT, nnetworks->target_net, weight_in, ".ff_target_20250508_17h50m56s_26300.txt"); + +struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 500/*size_t delay_between_episodes*/, + 50/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.1/*0.99*/ /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 1/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 12/*float scale_x*/,12 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + + + + +#if 1 +HIDE_TEST(first_learn_vehicle13){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + +#if 1 +HIDE_TEST(first_learn_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + + + +#if 0 +HIDE_TEST(first_learn_vehicle){ + size_t nb_block = 7; + size_t dim= 2; + struct blocks * path = create_blocks(nb_block, dim); + + + +#if 1 + + copy_coordinate(path->lower_bound_block[0], (float[]){0,300}); + copy_coordinate(path->upper_bound_block[0], (float[]){400,700}); + copy_coordinate(path->lower_bound_block[1], (float[]){100,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){1000,300}); + copy_coordinate(path->lower_bound_block[2], (float[]){1000,50}); + copy_coordinate(path->upper_bound_block[2], (float[]){1400,500}); + copy_coordinate(path->lower_bound_block[3], (float[]){1400,200}); + copy_coordinate(path->upper_bound_block[3], (float[]){1800,700}); + copy_coordinate(path->lower_bound_block[4], (float[]){1100,700}); + copy_coordinate(path->upper_bound_block[4], (float[]){1700,1000}); + copy_coordinate(path->lower_bound_block[5], (float[]){800,600}); + copy_coordinate(path->upper_bound_block[5], (float[]){1100,975}); + copy_coordinate(path->lower_bound_block[6], (float[]){100,700}); + copy_coordinate(path->upper_bound_block[6], (float[]){800,975}); + + +#else + + copy_coordinate(path->lower_bound_block[0], (float[]){0,3}); + copy_coordinate(path->upper_bound_block[0], (float[]){4,7}); + copy_coordinate(path->lower_bound_block[1], (float[]){1,0}); + copy_coordinate(path->upper_bound_block[1], (float[]){10,3}); + copy_coordinate(path->lower_bound_block[2], (float[]){10,0.5}); + copy_coordinate(path->upper_bound_block[2], (float[]){14,5}); + copy_coordinate(path->lower_bound_block[3], (float[]){14,2}); + copy_coordinate(path->upper_bound_block[3], (float[]){18,7}); + copy_coordinate(path->lower_bound_block[4], (float[]){11,7}); + copy_coordinate(path->upper_bound_block[4], (float[]){17,10}); + copy_coordinate(path->lower_bound_block[5], (float[]){8,6}); + copy_coordinate(path->upper_bound_block[5], (float[]){11,9.75}); + copy_coordinate(path->lower_bound_block[6], (float[]){1,7}); + copy_coordinate(path->upper_bound_block[6], (float[]){8,9.75}); + + +#endif + + update_bounds_limits_blocks(path); + + struct vehicle *car = create_vehicle(path); + + config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,24,24,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + //config_layers *pconf = create_config_layers_from_OneD(4,(size_t[]){3,14,14,3}); /* 3 input , 3 target; 2 hidden layer with 24 neurons each */ + + bool randomize=true; + float minR = -0.5, maxR = 0.5; + int randomRange = 5000; + size_t nb_prod_thread = 2; + size_t nb_calc_thread = 4; + float learning_rate = 0.1; + struct networks_qlearning *nnetworks = create_nework_qlearning( + pconf, + randomize, minR, maxR, randomRange, + nb_prod_thread, nb_calc_thread, + learning_rate + ); + + struct status_qlearning *qlstatus = create_status_qlearning (); + struct delay_params *dly = create_delay_params ( + 100/*size_t delay_between_episodes*/, + 10/*size_t delay_between_games*/ + ); + + struct qlearning_params *qlparams = create_qlearning_params ( + 0.95/*float gamma*/, + learning_rate, + 0 /* (not used!)float discount_factor*/, + 0.85 /*float exploration_factor*/, + 20/*long int nb_training_before_update_weight_in_target*/, + 10000/*size_t number_episodes*/ + ); +/* UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->main_net, f_act, f ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, d_f_act , df ); + UPDATE_ATTRIBUTE_NEURONE_IN_ALL_LAYERS(TYPE_FLOAT, nnetworks->target_net, f_act , f ); +*/ + struct print_params *pprint = create_print_params( + 20/*float scale_x*/,40 /*float scale_y*/, + dly/*struct delay_params * dly_p*/ + ); + + struct RL_agent *rlAgent = create_RL_agent ( + nnetworks /*struct networks_qlearning * networks*/, + car /*struct vehicle * car*/, + qlstatus /*struct status_qlearning * status*/, + pprint /*struct print_params * pprint*/, + qlparams/*struct qlearning_params *qlearnParams*/ + ); + + learn_to_drive(rlAgent); + + free_RL_agent(rlAgent); + + + + +} +#endif + + +int main(int argc, char **argv){ + + + run_all_tests_args(argc, argv); + +return 0; } diff --git a/ytest_t/include_ytest/include/ftest/ftest.h b/ytest_t/include_ytest/include/ftest/ftest.h index 5d9d9b3..1f527ab 100644 --- a/ytest_t/include_ytest/include/ftest/ftest.h +++ b/ytest_t/include_ytest/include/ftest/ftest.h @@ -925,6 +925,16 @@ do{ #define TEST(name_f) \ FTEST__(__COUNTER__,name_f) +// HIDE_TEST +// to not execute test, it helps to manualy avoid test in code, +// instead of comment or #if 0 #endif +#define H__TEST__(count, name_f) \ + void CONCAT(TEST_##name_f##____,count)(void) \ + + +#define HIDE_TEST(name_f)\ + H__TEST__(__COUNTER__,name_f) + /* #define ASSERT_TRUE(val)\ if(expected_true_f(val,#val,__func__) == false) {error_print("%s\n\n","Failure"); return;}