/**This implements: "A possible representation of reward in the learning of saccades" C. Weber and J. Triesch. Proc. Epigenetic Robotics, pp. 153-60 (2006). After training: the weights w_5_2 and w_6_2 are those of Fig.5a), the weights w_3_2 are those from which a sample is shown in Fig.5b), and activations J, I and E on area 1 represent Fig.5 c),d) and e), respectively. **/ global { iter 0 areas 7 mult 1 d "/tmp/coco" r "" } all { d_a 0 d_b 0 } /*image*/ area 0 { d_a 300 d_b 300 } /*input (retina)*/ area 1 { d_a 101 d_b 101 } /*SC*/ area 2 { d_a 51 d_b 101 } /*motor for vertical saccades (deeper layer on SC, only one line of neurons along medio-lateral dimension)*/ area 3 { d_a 1 /*21*/ d_b 101 } /*saccade endpoint*/ area 4 { d_a 1 d_b 2 } /*motor unit for horizontal saccades -- trained with vectorial error signal*/ area 5 { d_a 1 /*21*/ d_b 1 } /*motor unit for horizontal saccades -- trained with vectorial error signal*/ area 6 { d_a 1 /*21*/ d_b 1 } set sigma 3.0 /*stimulus (Gaussian)*/ set eps 1.0 /*2.0*/ set importW 0 set exportW 1 set rad 60 /*angle radius used in retina, and also motor range ... IGNORED!*/ if ($importW = 0) series (1) { sw (0; 1; alltime) { 2(n) {N,w; weight_list_alloc_full; 3 ; ; 0.0+0.01} /**these are "inverted", as used with weight_list_AXON_total**/ 5(n) {N,w; weight_list_alloc_full; 2 ; ; 0.0+0.01} 6(n) {N,w; weight_list_alloc_full; 2 ; ; 0.0+0.01} } sw (0; 1; alltime) { 2(n) {N,w+d; weight_list_export ; 3 ; ; } 5(n) {N,w+d; weight_list_export ; 2 ; ; } 6(n) {N,w+d; weight_list_export ; 2 ; ; } } sw (0; 1; order) { 5(o) {N,w; weight_list_cuthalfinput; 2 ; ; 0} 6(o) {N,w; weight_list_cuthalfinput; 2 ; ; 1} } } if ($importW = 1) series (1) { sw (0; 1; alltime) { 2(n) {N,w+d; weight_list_alloc_import; 3; ; } } } series (150000) { sw (0; 1; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, 0.2+3.0, 1.0, 1, 0.5, 50} } /*new,area sigma, height mode ??? border*/ if (iter < 6000) sw (0; 1; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, 2.0+5.0, 0.5, 1, 0.5, 50} } /*new,area sigma, height mode ??? border*/ if (iter < 2000) sw (0; 1; alltime) { 0(n) {R ; data_gauss_3areas_2D ; ; ; 1, 0, 4.0+10.0, 0.5, 1, 0.5, 50} } /*new,area sigma, height mode ??? border*/ sw (0; 1; order) { 0(t) {R ; total_scale_to_max ; ; ; 1.0 } 4(o) {O ; local_const ; , ; , ; 0.0 } 1(t) {R ; total_cut_at ; 0, 4; R, O; 1 } 1(t) {N, r; total_winner ; ; R ; 1 } /**also tests whether at edge or outside of retina circle and returns r=1 if so**/ 2(t) {R ; total_retina_to_SC ; 1 ; R ; 0 } 2(t) {A ; total_set_mean ; ; R ; } 3(t) {R, w; weight_list_AXON_total; 2 ; R ; 0,0,0} 2(t) {L ; total_normalize ; ; R ; 1.0 } 2(t) {L ; total_neigh_winner ; ; ; 1, 2.0+2.0+2.0, 1000+10000, 1} 5(o) {R, w; weight_list_feed ; 2 ; L ; } 6(o) {R, w; weight_list_feed ; 2 ; L ; } 6(o) {R ; local_mult_const ; , ; , ; -1 } 6(t) {S ; total_copy_nth ; 5 ; R ; 0, 0} 6(o) {T ; local_sum ; , ; R, S; } 4(t) {R ; total_copy_nth ; 6 ; T ; 0, 1} /**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/ /*3(t) {T ; total_true_softmax_row; ; R ; 2.0 }*/ 3(t) {S ; total_winner_per_row ; ; R ; 2.0 } /**here sigma 1 and below sigma 2 ; this is heuristically better then other way around**/ if (iter < 6000) 3(t) {S ; total_winner_per_row ; ; R ; 6.0 } if (iter < 2000) 3(t) {S ; total_winner_per_row ; ; R ; 10.0 } 3(t) {T ; total_as_rand ; ; S ; 0.3+1+2 } /**for each row**/ 3(t) {T ; total_winner_per_row ; ; ; 4.0 } if (iter < 6000) 3(t) {T ; total_winner_per_row ; ; ; 6.0 } if (iter < 2000) 3(t) {T ; total_winner_per_row ; ; ; 10.0 } 4(t) {R ; total_population_motor_row;3; T ; -54+-54, 54+54, 0} /**3rd parameter says that only neuron0 should be updated (with row0)**/ 1(t) {S ; total_cut_at ; 0, 4; R, R; 1 } /**first component of inarea2: vert; second component: horiz**/ 2(t) {S ; total_retina_to_SC ; 1 ; S ; 0 } 2(t) {B ; total_set_mean ; ; S ; } 2(o) {C ; local_sub ; , ; B, A; } 2(o) {D ; local_mult ; , ; C, R; } if (r=0) 2(o) {N, w; weight_list_hebb ; 2, 3; D, T; $eps} if (r=0) 2(o) {N, w; weight_list_rectify ; 3 ; ; 0, 1} if (r=0) 2(o) {N, w; weight_list_normalize; 3 ; ; 1, 2} 5(t) {S ; total_mean_left_min_right;2; S ; } /**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/ /*5(o) {S ; local_sign ; , ; , ; }*/ if (r=0) 5(o) {N, w; weight_list_hebb ; 5, 2; S, L; -3.0} 6(t) {S ; total_mean_left_min_right;2; S ; } /**copy the value from the area5 unit to the 2nd motor unit (for horiz)**/ /*6(o) {S ; local_sign ; , ; , ; }*/ if (r=0) 6(o) {N, w; weight_list_hebb ; 6, 2; S, L; 3.0} } /**reset error count -- so final error is average between iter 100000 and 150000**/ if (iter % 100000) sw (0; 1; order) { 1(o) {X ; local_const ; , ; , ; 0.0} /**position error x**/ 1(o) {Y ; local_const ; , ; , ; 0.0} /**position error y**/ 1(o) {I ; local_const ; , ; , ; 0.0} /**position error x**/ 1(o) {J ; local_const ; , ; , ; 0.0} /**position error y**/ 1(o) {K ; local_const ; , ; , ; 0.0} /**counter**/ 1(o) {F ; local_const ; , ; , ; 0.0} /**error init (isn't incremented but should be 0 outside of retina circle)**/ 2(o) {X ; local_const ; , ; , ; 0.0} /**position error x**/ 2(o) {Y ; local_const ; , ; , ; 0.0} /**position error y**/ 2(o) {I ; local_const ; , ; , ; 0.0} /**position error x**/ 2(o) {J ; local_const ; , ; , ; 0.0} /**position error y**/ 2(o) {K ; local_const ; , ; , ; 0.0} /**counter**/ 2(o) {F ; local_const ; , ; , ; 0.0} /**error init (isn't incremented but should be 0 outside of retina circle)**/ } if (r=0) sw (0; 1; order) { 4(t) {C ; total_softmax ; 1 ; R ; 1.0, 3} /**writes x,y of maximum to auxiliary area4 which has two units**/ /*4(t) {A ; total_dist_xy_middle ; 1 ; R ; 1+1 }*/ 4(t) {B ; total_dist_xy_middle ; 1 ; S ; 1+1 } 1(t) {O ; total_error_at ; ,4+4; ,C+B; 0 } /**at x,y-position of C give out x-component of B, everywhere else give out zero **/ 1(t) {Q ; total_error_at ; ,4+4; ,C+B; 1 } /** " y B " **/ 1(t) {V ; total_error_at ; ,4+4; ,C+C; 2 } /** " 1, in order to count how often the target is there**/ 1(o) {X ; local_sum ; , ; X, O ; } /**sums up the errors**/ 1(o) {Y ; local_sum ; , ; Y, Q ; } /**sums up the errors**/ 1(o) {K ; local_sum ; , ; K, V ; } /**sums up the occurences -- to normalise the errors**/ 1(o) {I ; local_div ; , ; X, K ; } /**averaged (over runs)**/ 1(o) {J ; local_div ; , ; Y, K ; } /**averaged (over runs)**/ 1(o) {A ; local_mult ; , ; O, O ; } /**squared error in x-direction**/ 1(o) {B ; local_mult ; , ; Q, Q ; } /** " y " **/ 1(o) {C ; local_sum ; , ; A, B ; } /**sum of squared error**/ 1(o) {C ; local_sqrt ; , ; , ; } /**distance**/ 1(o) {F ; local_sum ; , ; F, C ; } /**sums up distances**/ 1(o) {E ; local_div ; , ; F, K ; } /**averaged (over runs) distance**/ 1(o) {E ; local_rectify ; , ; , ; 10.0+-1} } if (r=0) sw (0; 1; order) { 4(t) {C ; total_softmax ; 2 ; R ; 1.0, 3} /**writes x,y of maximum to auxiliary area4 which has two units**/ /*4(t) {A ; total_dist_xy_middle ; 1 ; R ; 1+1 }*/ 4(t) {B ; total_dist_xy_middle ; 1 ; S ; 1+1 } 2(t) {O ; total_error_at ; ,4+4; ,C+B; 0 } /**at x,y-position of C give out x-component of B, everywhere else give out zero **/ 2(t) {Q ; total_error_at ; ,4+4; ,C+B; 1 } /** " y B " **/ 2(t) {V ; total_error_at ; ,4+4; ,C+C; 2 } /** " 1, in order to count how often the target is there**/ 2(o) {X ; local_sum ; , ; X, O ; } /**sums up the errors**/ 2(o) {Y ; local_sum ; , ; Y, Q ; } /**sums up the errors**/ 2(o) {K ; local_sum ; , ; K, V ; } /**sums up the occurences -- to normalise the errors**/ 2(o) {I ; local_div ; , ; X, K ; } /**averaged (over runs)**/ 2(o) {J ; local_div ; , ; Y, K ; } /**averaged (over runs)**/ 2(o) {A ; local_mult ; , ; O, O ; } /**squared error in x-direction**/ 2(o) {B ; local_mult ; , ; Q, Q ; } /** " y " **/ 2(o) {C ; local_sum ; , ; A, B ; } /**sum of squared error**/ 2(o) {C ; local_sqrt ; , ; , ; } /**distance**/ 2(o) {F ; local_sum ; , ; F, C ; } /**sums up distances**/ 2(o) {E ; local_div ; , ; F, K ; } /**averaged (over runs) distance**/ } if (iter % 10) sw (0; 1; alltime) { 0(n) {R, d; observe_act ; ; ; } 1(n) {R, d; observe_act ; ; ; } 2(n) {R, d; observe_act ; ; ; } 3(n) {R, d; observe_act ; ; ; } 4(n) {R, d; observe_act ; ; ; } 4(n) {A, d; observe_act ; ; ; } 4(n) {B, d; observe_act ; ; ; } 1(n) {S, d; observe_act ; ; ; } 2(n) {S, d; observe_act ; ; ; } 2(n) {D, d; observe_act ; ; ; } 2(n) {L, d; observe_act ; ; ; } 3(n) {T, d; observe_act ; ; ; } 3(n) {S, d; observe_act ; ; ; } if (r=0) 1(n) {N, d; observe_act ; ; ; } 1(n) {I, d; observe_phase; ; ; } 1(n) {J, d; observe_phase; ; ; } 1(n) {K, d; observe_phase; ; ; } 1(n) {E, d; observe_phase; ; ; } 2(n) {I, d; observe_phase; ; ; } 2(n) {J, d; observe_phase; ; ; } 2(n) {K, d; observe_phase; ; ; } 2(n) {E, d; observe_phase; ; ; } 5(n) {R, d; observe_act ; ; ; } 5(n) {S, d; observe_act ; ; ; } } if (iter % 5000) sw (0; 1; alltime) { if ($exportW = 1) 3(n) {N,w; weight_list_free ; 2; ; } if ($exportW = 1) 3(n) {N,w; weight_list_alloc_invert; 2; ; } if ($exportW = 1) 3(n) {N,w+d; weight_list_export ; 2; ; } } if (iter % 100) sw (0; 1; alltime) { if ($exportW = 1) 2(n) {N,w+d; weight_list_export ; 3 ; ; } if ($exportW = 1) 2(n) {N,w+d; weight_list_histogram; 3 ; ; 0 } if ($exportW = 1) 5(n) {N,w+d; weight_list_export ; 2 ; ; } if ($exportW = 1) 5(n) {N,w+d; weight_list_histogram; 2 ; ; 0 } if ($exportW = 1) 6(n) {N,w+d; weight_list_export ; 2 ; ; } if ($exportW = 1) 6(n) {N,w+d; weight_list_histogram; 2 ; ; 0 } } }