print('\n\nii = {} of {} (I_de); jj = {} of {} (L_di); kk = {} of {} (tau_di); qq = {} of {} (dt)'.format(ii+1,len(I_de_vec),jj+1,len(L_di_vec),kk+1,len(tau_di_vec),qq+1,len(dt_vec)))
      
      # setup soen sim for exp pulse seq
      input_1 = input_signal(name = 'input_synaptic_drive', 
                             input_temporal_form = 'single_spike', # 'single_spike' or 'constant_rate' or 'arbitrary_spike_train'
                             spike_times = [5e-9])            
  
      synapse_1 = synapse(name = 'synapse_under_test',
                          synaptic_circuit_inductors = [100e-9,100e-9,400e-12],
                          synaptic_circuit_resistors = [5e3,4.008],
                          synaptic_hotspot_duration = 200e-12,
                          synaptic_spd_current = 10e-6,
                          input_direct_connections = ['input_synaptic_drive'],
                          num_jjs = num_jjs,
                          inhibitory_or_excitatory = 'excitatory',
                          synaptic_dendrite_circuit_inductances = [0e-12,20e-12,200e-12,77.5e-12],
                          synaptic_dendrite_input_synaptic_inductance = [20e-12,1],
                          junction_critical_current = 40e-6,
                          bias_currents = [I_de, 36e-6, 35e-6],
                          integration_loop_self_inductance = L_di,
                          integration_loop_output_inductance = 0e-12,
                          integration_loop_time_constant = tau_di)
 
      neuron_1 = neuron('dummy_neuron',
                        input_synaptic_connections = ['synapse_under_test'],
                        input_synaptic_inductances = [[20e-12,1]],
                        junction_critical_current = 40e-6,
                        circuit_inductances = [0e-12,0e-12,200e-12,77.5e-12],                              
                        refractory_loop_circuit_inductances = [0e-12,20e-12,200e-12,77.5e-12],
                        refractory_time_constant = 50e-9,
Ejemplo n.º 2
0
         
 input_synapses = []
 input_inductances = []
 for pp in range(num_synapses):
     
     # initialize input signals
     name__i = 'input_signal__{:d}_{:d}'.format(num_id,pp)
     time_last_spike = num_tau_sim*tau_si_vec[ii]+observation_duration+2*1/rate_vec[jj]
     input_1 = input_signal(name__i, input_temporal_form = 'constant_rate', spike_times = [rate_vec[jj],time_last_spike],
     stochasticity = 'gaussian', jitter_params = jitter_params)   
     # print(input_1.spike_times)
     
     # initialize synapses
     name__s = 'input_synapse__{:d}_{:d}'.format(num_id,pp)
     synapse_1 = synapse(name__s, integration_loop_temporal_form = 'exponential', integration_loop_time_constant = tau_si_vec[ii], 
                         integration_loop_self_inductance = 50e-9, integration_loop_output_inductance = 200e-12, 
                         synaptic_bias_current = I_sy_vec[kk], integration_loop_bias_current = 31e-6,
                         input_signal_name = name__i)
     
     input_synapses.append(name__s)
     coupling_factor = -0.0375*num_synapses+0.5375
     input_inductances.append([10e-12,coupling_factor])
 
 #initialize neuron
 input_inductances.append([10e-12,0.5])
 name__n = 'rate_encoding_neuron__{:d}'.format(num_id)
 neuron_1 = neuron(name__n, input_synaptic_connections = input_synapses, input_synaptic_inductances = input_inductances,
                   thresholding_junction_critical_current = 40e-6, thresholding_junction_bias_current = 35e-6, 
                   refractory_temporal_form = 'exponential', refractory_time_constant = tau_ref_vec[qq], 
                   refractory_loop_self_inductance = 10e-9, refractory_loop_output_inductance = 200e-12)
        
 # propagate in time                         
            # setup soen sim for exp pulse seq
            input_1 = input_signal(
                name='in',
                input_temporal_form=
                'single_spike',  # 'single_spike' or 'constant_rate' or 'arbitrary_spike_train'
                spike_times=spike_times)

            sy = synapse(
                name='sy',
                synaptic_circuit_inductors=[100e3, 100e3, 400],
                synaptic_circuit_resistors=[5e6, 4.008e3],
                synaptic_hotspot_duration=0.2,
                synaptic_spd_current=10,
                input_direct_connections=['in'],
                num_jjs=num_jjs,
                inhibitory_or_excitatory='excitatory',
                synaptic_dendrite_circuit_inductances=[0, 20, 200, 77.5],
                synaptic_dendrite_input_synaptic_inductance=[20, 1],
                junction_critical_current=40,
                bias_currents=[I_de, 36, 35],
                integration_loop_self_inductance=L_di,
                integration_loop_output_inductance=0,
                integration_loop_time_constant=tau_di)

            ne = neuron('ne',
                        input_synaptic_connections=['sy'],
                        input_synaptic_inductances=[[20, 1]],
                        junction_critical_current=40,
                        circuit_inductances=[0, 0, 200, 77.5],
                        refractory_loop_circuit_inductances=[0, 20, 200, 77.5],
                        refractory_time_constant=50,
Ejemplo n.º 4
0
]
I_sy = 33e-6
L_si = 775e-9
tau_si = 500e-9

# initialize input signal
input_1 = input_signal('in',
                       input_temporal_form='arbitrary_spike_train',
                       spike_times=spike_times)

# initialize synapse
synapse_1 = synapse('sy',
                    num_jjs=3,
                    integration_loop_temporal_form='exponential',
                    integration_loop_time_constant=tau_si,
                    integration_loop_self_inductance=L_si,
                    integration_loop_output_inductance=400e-12,
                    synaptic_bias_currents=[I_spd, I_sy, 36e-6, 35e-6],
                    input_signal_name='in',
                    synapse_model_params=sim_params)

# synapse_1.run_sim()

# actual_drive = np.vstack((synapse_1.time_vec[:],synapse_1.I_spd[:]))
# actual_drive_array.append(actual_drive)
# actual_data = np.vstack((synapse_1.time_vec[:],synapse_1.I_si[:]))
# sf_data = np.vstack((synapse_1.time_vec[:],synapse_1.I_sf[:]))
# actual_data_array.append(actual_data)

#%% neuron
Ejemplo n.º 5
0
    target_drive = np.vstack((data_dict['time'], data_dict['L0#branch']))
    target_drive_array.append(target_drive)
    target_data = np.vstack((data_dict['time'], data_dict['L2#branch']))
    target_data_array.append(target_data)

    # initialize input signal
    input_1 = input_signal('in',
                           input_temporal_form='arbitrary_spike_train',
                           spike_times=spike_times)

    # initialize synapse
    synapse_1 = synapse('sy',
                        num_jjs=2,
                        integration_loop_temporal_form='exponential',
                        integration_loop_time_constant=tau_si_vec[ii],
                        integration_loop_self_inductance=L_si_vec[ii],
                        integration_loop_output_inductance=0e-12,
                        synaptic_bias_currents=[I_spd, I_sy_vec[ii], I_sc],
                        input_signal_name='in',
                        synapse_model_params=sim_params)

    synapse_1.run_sim()

    actual_drive = np.vstack((synapse_1.time_vec[:], synapse_1.I_spd[:]))
    actual_drive_array.append(actual_drive)
    actual_data = np.vstack((synapse_1.time_vec[:], synapse_1.I_si[:]))
    sf_data = np.vstack((synapse_1.time_vec[:], synapse_1.I_sf[:]))
    actual_data_array.append(actual_data)

    if calculate_chi_squared == True:
        error_drive = chi_squared_error(target_drive, actual_drive)
    # calculate average currents, voltages, and times
    V_sf_wr_avg = np.zeros([len(j_peaks)-1])
    I_sf_wr_avg = np.zeros([len(j_peaks)-1])
    time_avg = np.zeros([len(j_peaks)-1])
    
    for jj in range(len(j_peaks)-1):
        ind_vec = np.arange(j_peaks[jj],j_peaks[jj+1],1)
        V_sf_wr_avg[jj] = np.sum(V_sf_wr[ind_vec])/len(ind_vec) 
        I_sf_wr_avg[jj] = np.sum(I_sf_wr[ind_vec])/len(ind_vec)
        time_avg[jj] = np.sum(time_vec[ind_vec])/len(ind_vec)

    # initialize input signal
    input_1 = input_signal('in', input_temporal_form = 'arbitrary_spike_train', spike_times = spike_times)
        
    # initialize synapse    
    synapse_1 = synapse('sy', num_jjs = 1, synaptic_bias_currents = [I_sy_vec[ii]], input_signal_name = 'in', synapse_model_params = sim_params)
    
    synapse_1.run_sim() 
    
    I_sf = synapse_1.I_sf
    V_sf = synapse_1.V_sf
    r_spd1 = synapse_1.r_spd1
    I_spd2 = I_sf - I_sy_vec[ii]
    j_sf_state = synapse_1.j_sf_state
    
    actual_drive = np.vstack((synapse_1.time_vec[:],I_spd2[:]))
    actual_data = np.vstack((synapse_1.time_vec[:],I_sf[:])) 
    actual_data_array.append(actual_data)
    
    # error_drive = chi_squared_error(target_drive,actual_drive)
    # error_signal = chi_squared_error(target_data,actual_data)
Ejemplo n.º 7
0
def synapse_model__parameter_sweep(data_file_list, I_sy_vec, L_si_vec,
                                   tau_si_vec, dt, tf, spike_times, gamma1_vec,
                                   gamma2_vec, gamma3_vec,
                                   master_error_plot_name):

    gamma3_init = 1

    master_error_plot_name = 'mstr_err__' + master_error_plot_name

    best_params = dict()
    best_params['gamma1'] = []
    best_params['gamma2'] = []
    best_params['gamma3'] = []

    data_array = dict()
    data_array['gamma1_vec'] = gamma1_vec
    data_array['gamma2_vec'] = gamma2_vec
    data_array['gamma3_vec'] = gamma3_vec

    num_sims = len(data_file_list)
    num_gamma1 = len(gamma1_vec)
    num_gamma2 = len(gamma2_vec)
    num_gamma3 = len(gamma3_vec)

    print(
        '\n\nrunning synapse_model__parameter_sweep\n\nnum_files = {:d}\nnum_gamma1 = {:d}\nnum_gamma2 = {:d}'
        .format(num_sims, num_gamma1, num_gamma2))

    #------------------------
    # find best gamma1, gamma2
    #------------------------

    error_mat_master__gamma1_gamma2 = np.zeros([num_gamma1, num_gamma2])
    for ii in range(num_sims):
        print('\ndata_file {} of {}\n'.format(ii + 1, num_sims))
        # plt.close('all')

        # WR data
        directory = 'wrspice_data/fitting_data'
        file_name = data_file_list[ii]
        data_dict = read_wr_data(directory + '/' + file_name)
        target_data = np.vstack((data_dict['time'], data_dict['L3#branch']))
        wr_drive = np.vstack((data_dict['time'], data_dict['L0#branch']))

        # initialize input signal
        name__i = 'in'
        input_1 = input_signal(name__i,
                               input_temporal_form='arbitrary_spike_train',
                               spike_times=spike_times)

        error_mat_1 = np.zeros([num_gamma1, num_gamma2])
        print('\nseeking gamma1, gamma2 ...\n')
        for aa in range(num_gamma1):
            for bb in range(num_gamma2):

                print('aa = {} of {}, bb = {} of {}'.format(
                    aa + 1, num_gamma1, bb + 1, num_gamma2))

                # create sim_params dictionary
                sim_params = dict()
                sim_params['gamma1'] = gamma1_vec[aa]
                sim_params['gamma2'] = gamma2_vec[bb]
                sim_params['gamma3'] = gamma3_init
                sim_params['dt'] = dt
                sim_params['tf'] = tf

                # initialize synapse
                name_s = 'sy'
                synapse_1 = synapse(
                    name_s,
                    integration_loop_temporal_form='exponential',
                    integration_loop_time_constant=tau_si_vec[ii],
                    integration_loop_self_inductance=L_si_vec[ii],
                    integration_loop_output_inductance=0e-12,
                    synaptic_bias_current=I_sy_vec[ii],
                    integration_loop_bias_current=35e-6,
                    input_signal_name='in',
                    synapse_model_params=sim_params)

                synapse_1.run_sim()

                actual_data = np.vstack(
                    (synapse_1.time_vec[:], synapse_1.I_si[:, 0]))
                error_mat_1[aa,
                            bb] = chi_squared_error(target_data, actual_data)

                plot_wr_comparison__synapse(
                    file_name + '; gamma1 = {:f}, gamma2 = {:f}'.format(
                        gamma1_vec[aa], gamma2_vec[bb]), spike_times, wr_drive,
                    target_data, actual_data, file_name, error_mat_1[aa, bb])

        error_mat_master__gamma1_gamma2 += error_mat_1
        ind_best = np.where(
            error_mat_1 == np.amin(error_mat_1))  #error_mat.argmin()
        gamma1_best = gamma1_vec[ind_best[0]][0]
        gamma2_best = gamma2_vec[ind_best[1]][0]
        print('gamma1_best = {}'.format(gamma1_best))
        print('gamma2_best = {}\n\n'.format(gamma2_best))
        best_params['gamma1'].append(gamma1_best)
        best_params['gamma2'].append(gamma2_best)
        data_array['error_mat__gamma1_gamma2'] = error_mat_1

        #plot errors
        # title_string = '{}\ngamma1_best = {:1.2f}, gamma2_best = {:1.2f}'.format(data_file_list[ii],gamma1_best,gamma2_best)
        # save_str = '{}__error__gamma1_gamma2'.format(data_file_list[ii])
        # plot_error_mat(error_mat_1[:,:],gamma1_vec,gamma2_vec,'gamma1','gamma2',title_string,save_str)

        # #repeat best one and plot
        sim_params = dict()
        sim_params['gamma1'] = gamma1_best
        sim_params['gamma2'] = gamma2_best
        sim_params['gamma3'] = gamma3_init
        sim_params['dt'] = dt
        sim_params['tf'] = tf

        # initialize synapse
        name_s = 'sy'
        synapse_1 = synapse(name_s,
                            integration_loop_temporal_form='exponential',
                            integration_loop_time_constant=tau_si_vec[ii],
                            integration_loop_self_inductance=L_si_vec[ii],
                            integration_loop_output_inductance=0e-12,
                            synaptic_bias_current=I_sy_vec[ii],
                            integration_loop_bias_current=35e-6,
                            input_signal_name='in',
                            synapse_model_params=sim_params)

        synapse_1.run_sim()

        actual_data = np.vstack((synapse_1.time_vec[:], synapse_1.I_si[:, 0]))
        error__si = chi_squared_error(target_data, actual_data)

        main_title = '{}\ngamma1_best_{:6.4f}_gamma2_best_{:6.4f}'.format(
            data_file_list[ii], gamma1_best, gamma2_best)
        plot_wr_comparison__synapse(main_title, spike_times, wr_drive,
                                    target_data, actual_data, file_name,
                                    error__si)

    # # save data
    # save_string = 'wr_fits__finding_gamma1_gamma2'
    # data_array['wr_spice_data_file_list'] = data_file_list
    # data_array['best_params'] = best_params
    # data_array['error_mat_master__gamma1_gamma2'] = error_mat_master__gamma1_gamma2
    # print('\n\nsaving session data ...')
    # save_session_data(data_array,save_string)

    #plot errors
    title_string = '{}; gamma1_best = {:6.4f}, gamma2_best = {:6.4f}'.format(
        master_error_plot_name, gamma1_best, gamma2_best)
    save_str_1 = '{}__master_error__gamma1_gamma2'.format(
        master_error_plot_name)
    plot_error_mat(error_mat_master__gamma1_gamma2[:, :], gamma1_vec,
                   gamma2_vec, 'gamma1', 'gamma2', title_string, save_str_1)

    #-----------------
    # find best gamma3
    #-----------------
    # error_mat_master__gamma3 = np.zeros([num_gamma3])
    # for ii in range(num_sims):
    #     print('\ndata_file {} of {}\n'.format(ii+1,num_sims))
    #     # plt.close('all')

    #     # WR data
    #     directory = 'wrspice_data/fitting_data'
    #     file_name = data_file_list[ii]
    #     data_dict = read_wr_data(directory+'/'+file_name)
    #     target_data = np.vstack((data_dict['time'],data_dict['L3#branch']))
    #     wr_drive = np.vstack((data_dict['time'],data_dict['L0#branch']))

    #     # initialize input signal
    #     name__i = 'in'
    #     input_1 = input_signal(name__i, input_temporal_form = 'arbitrary_spike_train', spike_times = spike_times)

    #     error_mat_2 = np.zeros([num_gamma3])
    #     print('\nseeking gamma3 ...\n')
    #     for aa in range(num_gamma3):

    #         print('aa = {} of {}'.format(aa+1,num_gamma3))

    #         # create sim_params dictionary
    #         sim_params = dict()
    #         sim_params['gamma1'] = gamma1_best
    #         sim_params['gamma2'] = gamma2_best
    #         sim_params['gamma3'] = gamma3_vec[aa]
    #         sim_params['dt'] = dt
    #         sim_params['tf'] = tf

    #         # initialize synapse
    #         name_s = 'sy'
    #         synapse_1 = synapse(name_s, integration_loop_temporal_form = 'exponential', integration_loop_time_constant = tau_si_vec[ii],
    #                             integration_loop_self_inductance = L_si_vec[ii], integration_loop_output_inductance = 0e-12,
    #                             synaptic_bias_current = I_sy_vec[ii], integration_loop_bias_current = 35e-6,
    #                             input_signal_name = 'in', synapse_model_params = sim_params)

    #         synapse_1.run_sim()

    #         actual_data = np.vstack((synapse_1.time_vec[:],synapse_1.I_si[:,0]))
    #         error_mat_2[aa] = chi_squared_error(target_data,actual_data)

    #         # plot_wr_comparison__synapse(file_name+'gamma1 = {:f}, gamma2 = {:f}'.format(gamma1_vec[aa],gamma2_vec[bb]),spike_times,wr_drive,target_data,actual_data,file_name,error_mat_1[aa,bb])

    #     error_mat_master__gamma3 += error_mat_2
    #     ind_best = np.where(error_mat_2 == np.amin(error_mat_2))#error_mat.argmin()
    #     gamma3_best = gamma3_vec[ind_best[0]][0]
    #     print('gamma3_best = {}'.format(gamma3_best))
    #     best_params['gamma3'].append(gamma3_best)
    #     data_array['error_mat__gamma3'] = error_mat_2

    #     #plot errors
    #     # title_string = '{}\ngamma1_best = {:1.2f}, gamma2_best = {:1.2f}'.format(data_file_list[ii],gamma1_best,gamma2_best)
    #     # save_str = '{}__error__gamma1_gamma2'.format(data_file_list[ii])
    #     # plot_error_mat(error_mat_1[:,:],gamma1_vec,gamma2_vec,'gamma1','gamma2',title_string,save_str)

    #     # repeat best one and plot
    #     sim_params = dict()
    #     sim_params['gamma1'] = gamma1_best
    #     sim_params['gamma2'] = gamma2_best
    #     sim_params['gamma3'] = gamma3_best
    #     sim_params['dt'] = dt
    #     sim_params['tf'] = tf

    #     # initialize synapse
    #     name_s = 'sy'
    #     synapse_1 = synapse(name_s, integration_loop_temporal_form = 'exponential', integration_loop_time_constant = tau_si_vec[ii],
    #                         integration_loop_self_inductance = L_si_vec[ii], integration_loop_output_inductance = 0e-12,
    #                         synaptic_bias_current = I_sy_vec[ii], integration_loop_bias_current = 35e-6,
    #                         input_signal_name = 'in', synapse_model_params = sim_params)

    #     synapse_1.run_sim()

    #     actual_data = np.vstack((synapse_1.time_vec[:],synapse_1.I_si[:,0]))
    #     error__si = chi_squared_error(target_data,actual_data)

    #     main_title = '{}\ngamma1_best = {:6.4f}, gamma2_best = {:6.4f}\ngamma3_best_{:6.4f}'.format(data_file_list[ii],gamma1_best,gamma2_best,gamma3_best)
    #     plot_wr_comparison__synapse(main_title,spike_times,wr_drive,target_data,actual_data,file_name,error__si)

    # # save data
    # save_string = 'wr_fits__finding_gamma1_gamma2'
    # data_array['wr_spice_data_file_list'] = data_file_list
    # data_array['best_params'] = best_params
    # data_array['error_mat_master__gamma1_gamma2'] = error_mat_master__gamma1_gamma2
    # print('\n\nsaving session data ...')
    # save_session_data(data_array,save_string)

    #plot errors
    # title_string = '{}; gamma3_best = {:6.4f}'.format(master_error_plot_name,gamma3_best)
    # save_str_1 = '{}__master_error__gamma3'.format(master_error_plot_name)
    # plot_error_vec(error_mat_master__gamma1_gamma2[:,:],gamma1_vec,gamma2_vec,'gamma1','gamma2',title_string,save_str_1)

    return best_params, error_mat_master__gamma1_gamma2, error_mat_master__gamma3
Ejemplo n.º 8
0
#%%
import numpy as np
# import copy
# import time

from soen_sim import synapse, neuron

#%% set up synapses

synapse_0 = synapse()

synapse_1 = synapse('test_synapse__exp',
                    loop_temporal_form='exponential',
                    time_constant=200e-9,
                    integration_loop_self_inductance=50e-9,
                    integration_loop_output_inductance=200e-12,
                    synaptic_bias_current=36e-6,
                    loop_bias_current=31e-6)

synapse_2 = synapse('test_synapse__power_law',
                    loop_temporal_form='power_law',
                    power_law_exponent=-1.1,
                    integration_loop_self_inductance=100e-9,
                    integration_loop_output_inductance=200e-12,
                    synaptic_bias_current=37e-6,
                    loop_bias_current=33e-6)

# for obj in synapse.get_instances():
#     print(obj.name)

#%% propagate in time