theta_init = np.pi*np.random.rand() x_cur = x_init y_cur = y_init theta_cur = theta_init simdata['x_init'] = x_cur simdata['y_init'] = y_cur err_l, err_r = 0, 0 simdata['rctr_nrn_trace'].append(np.zeros((18, 10))) simdata['nrn_nrn_trace'].append(np.zeros((10, 10))) motor_spks = nrns_sd[6:] for t in range(n_step): ev.update_refratory_perioud() simdata['traj'].append((x_cur, y_cur)) px = network.set_receptors_firing_rate(x_cur, y_cur, theta_cur, err_l, err_r) simdata['pixel_values'].append(px) # Run simulation for time-step nest.Simulate(t_step) simtime += t_step motor_firing_rates = network.get_motor_neurons_firing_rates(motor_spks) v_l_act, v_r_act, v_t, w_t, err_l, err_r, col, v_l_des, v_r_des = \ sim.update_wheel_speeds(x_cur, y_cur, theta_cur, motor_firing_rates) # Save dsired and actual speeds
def simulate_learning(neurons, receptors, nrns_sd, rctrs_sd, arena): """ Run simulation for 40 seconds based on network topology encoded in individual. @param individual: Binary string encoding network topology. @param arena: The arena object in which the simulation is carried out. @param n_step: Number of steps the simulation is divided in. @param t_step: Number of milliseconds in each step. @param reset: bool triggering the reset of the nest kernel. """ global simtime simdata = create_empty_data_lists() if data['init'] == 'random': simdata['x_init'], simdata['y_init'], theta_init = \ select_random_pose(arena) x_cur = simdata['x_init'] y_cur = simdata['y_init'] theta_cur = theta_init err_l, err_r = 0, 0 simdata['rctr_nrn_trace'].append(np.zeros((18, 10))) simdata['nrn_nrn_trace'].append(np.zeros((10, 10))) motor_spks = nrns_sd[6:] for t in range(n_step): ev.update_refratory_perioud() simdata['traj'].append((x_cur, y_cur)) px = network.set_receptors_firing_rate(x_cur, y_cur, theta_cur, err_l, err_r) simdata['pixel_values'].append(px) # Run simulation for time-step nest.Simulate(t_step) simtime += t_step motor_firing_rates = network.get_motor_neurons_firing_rates(motor_spks) v_l_act, v_r_act, v_t, w_t, err_l, err_r, col, v_l_des, v_r_des = \ motion.update_wheel_speeds(x_cur, y_cur, theta_cur, motor_firing_rates) # Save dsired and actual speeds simdata['speed_log'].append((v_l_act, v_r_act)) simdata['desired_speed_log'].append((v_l_des, v_r_des)) # Save motor neurons firing rates simdata['motor_fr'].append(motor_firing_rates) # Save linear and angualr velocities simdata['linear_velocity_log'].append(v_t) simdata['angular_velocity_log'].append(w_t) # Move robot according to the read-out speeds from motor neurons x_cur, y_cur, theta_cur = motion.move(x_cur, y_cur, theta_cur, v_t, w_t) nrns_st, rctrs_st = learning.get_spike_times(nrns_sd, rctrs_sd) rec_nrn_tags, nrn_nrn_tags, rctr_t, nrn_t, pt = \ learning.get_eligibility_trace(nrns_st, rctrs_st, simtime, simdata['rctr_nrn_trace'][t], simdata['nrn_nrn_trace'][t]) print simtime simdata['rctr_nrn_trace'].append(rec_nrn_tags) simdata['nrn_nrn_trace'].append(nrn_nrn_tags) # Stop simulation if collision occurs if col: simdata['speed_log'].extend((0, 0) for k in range(t, 400)) break simdata['fitness'] = ev.get_fitness_value(simdata['speed_log']) return simdata, rctr_t, nrn_t, pt, col