コード例 #1
0
def get_k_grad(t0, t1, dt, S_e, S_i, v, kernel_params):
    """ Get gradients (dv_soma/dw) for individual synaptic activations from
    fitted approximations.

    Parameters
    ----------
    t0, t1 :  float
        initial and final times for computing gradients
    dt : float
        simulation time step
    S_e, S_i : array_like
        input spike patterns for E and I synapses
    v : ndarray
        compartment voltages from simulation
    kernel_params : list
        parameters for fitted kernels (see dendrites.kernels)

    Returns
    -------
    F_e, F_i : list
        approximated gradients with associated synapse indices and presynaptic
        spike times F_e = [f_e, z_ind_e, z_e]
    """
    Z_e = sequences.subsequence(S_e, t0, t1)
    Z_i = sequences.subsequence(S_i, t0, t1)
    Z_e, z_ind_e = sequences.rate2temp(Z_e)
    Z_i, z_ind_i = sequences.rate2temp(Z_i)
    f_e, f_i = training.kernel_grad_ss(int(t0 / dt), int(t1 / dt), S_e, S_i,
                                       cell.seg_e, cell.seg_i, cell.b_type_e,
                                       cell.b_type_i, v, kernel_params, dt)
    F_e = [f_e, z_ind_e, Z_e - t1]
    F_i = [f_i, z_ind_i, Z_i - t1]
    return F_e, F_i
コード例 #2
0
def get_grad(cell, t0_ind, t1_ind, dt, S_e, S_i, soln, stim, I_inj):
    """ Get gradients (dv_soma/dw) for individual synaptic activations by
    solving variational equations between times t0 and t1 with fast somatic
    conductances set to zero.

    Parameters
    ----------
    cell : dendrites.comp_model.CModel object
        compartmental model instance used for simulation
    t0, t1 :  float
        initial and final times for computing gradients
    dt : float
        simulation time step
    S_e, S_i : array_like
        input spike patterns fro E and I synapses
    soln : list
        model states [v, m, h, n, p] (output from cell.simulate)
    stim : list
        synapse indices and states [ind_e, ind_i, A_r, A_d, N_r, N_d, G_r, G_d]

    Returns
    -------
    F_e, F_i : list
        computed gradients with associated synapse indices and presynaptic
        spike times F_e = [f_e, z_ind_e, z_e]
    """
    t0 = t0_ind * dt
    t1 = t1_ind * dt
    F_e = np.zeros(len(S_e))
    F_i = np.zeros(len(S_i))
    IC_sub = cell.set_IC(soln, stim, t0_ind)
    g_na_temp, g_k_temp = cell.P['g_na'], cell.P['g_k']

    cell.P['g_na'] = 0
    cell.P['g_k'] = 0
    t_s, soln_s, stim_s = cell.simulate(t0,
                                        t1,
                                        dt,
                                        IC_sub,
                                        S_e,
                                        S_i,
                                        I_inj=I_inj)
    Z_e = sequences.subsequence(S_e, t0, t1)
    Z_i = sequences.subsequence(S_i, t0, t1)
    z_ind_e = stim_s[0]
    z_ind_i = stim_s[1]
    Z_e = pad_S(Z_e)[z_ind_e]
    Z_i = pad_S(Z_i)[z_ind_i]
    f_e, f_i = cell.grad_w(soln_s, stim_s, t_s, dt, Z_e, Z_i, z_ind_e, z_ind_i)
    cell.P['g_na'] = g_na_temp
    cell.P['g_k'] = g_k_temp

    for k in range(len(z_ind_e)):
        F_e[z_ind_e[k]] += f_e[k, -1]
    for k in range(len(z_ind_i)):
        F_i[z_ind_i[k]] += f_i[k, -1]
    return F_e, F_i
コード例 #3
0
ファイル: sta_sim.py プロジェクト: babicknell/Dendrites
def get_grad(cell, t0, t1, dt, S_e, S_i, soln, stim):
    """ Get gradients (dv_soma/dw) for individual synaptic activations by
    solving variational equations between times t0 and t1 with fast somatic
    conductances set to zero.

    Parameters
    ----------
    cell : dendrites.comp_model.CModel object
        compartmental model instance used for simulation
    t0, t1 :  float
        initial and final times for computing gradients
    dt : float
        simulation time step
    S_e, S_i : array_like
        input spike patterns for E and I synapses
    soln : list
        model states [v, m, h, n, p] (output from cell.simulate)
    stim : list
        synapse indices and states [ind_e, ind_i, A_r, A_d, N_r, N_d, G_r, G_d]

    Returns
    -------
    v_pre : list
        voltage throughout the morphology preceding somatic spike
    F_e, F_i : list
        computed gradients with associated synapse indices and presynaptic
        spike times F_e = [f_e, z_ind_e, z_e]
    """
    IC_sub = cell.set_IC(soln, stim, int(t0 / dt))
    g_na_temp, g_k_temp = P['g_na'], P['g_k']
    cell.P['g_na'] = 0
    cell.P['g_k'] = 0
    t_s, soln_s, stim_s = cell.simulate(t0, t1, dt, IC_sub, S_e, S_i)
    Z_e = sequences.subsequence(S_e, t0, t1)
    Z_i = sequences.subsequence(S_i, t0, t1)
    Z_e, z_ind_e = sequences.rate2temp(Z_e)
    Z_i, z_ind_i = sequences.rate2temp(Z_i)
    f_e, f_i = cell.grad_w(soln_s, stim_s, t_s, dt, Z_e, Z_i, z_ind_e, z_ind_i)
    cell.P['g_na'] = g_na_temp
    cell.P['g_k'] = g_k_temp
    v_pre = soln[0][:, int(t1 / dt)]
    f_e = f_e[:, -1]
    f_i = f_i[:, -1]
    z_e = Z_e - t1
    z_i = Z_i - t1
    return [v_pre], [f_e, z_ind_e, z_e], [f_i, z_ind_i, z_i]
コード例 #4
0
def kernel_grad(t0_ind, t1_ind, S_e, S_i, seg_e, seg_i, b_type_e, b_type_i, v,
                kernel, dt):
    """Look up fitted plasticity kernels to approximate gradients. Sums over all
    inputs to a synapse.

    Parameters
    ----------
    t0, t1 : int
        time indices to define range for computing gradients
    S_e, S_i : list
        presynaptic spike times for E and I synapses
    seg_e, seg_i : ndarray
        segment locations of E and I synapses
    b_type_e, b_type_i : list
        branch types for all synapses (soma=-1, basal=0, oblique=1, apical=2)
    v : ndarray
        vector of model compartment voltages
    kernel : list
        parameters of plasticity kernel
    dt : float
        timestep

    Returns
    -------
    f_e, f_i : ndarray
        gradients (dv_soma/dw) for E and I synapses
    """
    t0 = t0_ind * dt
    t1 = t1_ind * dt
    Z_e = sequences.subsequence(S_e, t0, t1)
    Z_i = sequences.subsequence(S_i, t0, t1)
    Z_e, z_ind_e = sequences.rate2temp(Z_e)
    Z_i, z_ind_i = sequences.rate2temp(Z_i)
    s_e = t1 - Z_e
    s_i = t1 - Z_i
    f_e = np.zeros(len(S_e))
    f_i = np.zeros(len(S_i))
    if len(kernel) == 2:  # somatic only
        p_es, p_is = kernel
        for k, s in enumerate(s_e):
            f_e[z_ind_e[k]] += p_es(s)
        for k, s in enumerate(s_i):
            f_i[z_ind_i[k]] += p_is(s)
    else:  # basal and apical
        p_eb, p_ea, p_ib, p_ia = kernel
        if np.size(p_eb[0]) == 1:
            for k, s in enumerate(s_e):
                if b_type_e[z_ind_e[k]] == 2:
                    f_e[z_ind_e[k]] += p_ea(s)
                else:
                    f_e[z_ind_e[k]] += p_eb(s)
            for k, s in enumerate(s_i):
                if b_type_i[z_ind_i[k]] == 2:
                    f_i[z_ind_i[k]] += p_ia(s)
                else:
                    f_i[z_ind_i[k]] += p_ib(s)
        else:
            if v.ndim == 1:
                v_dend_e = v[seg_e[z_ind_e]]
                v_dend_i = v[seg_i[z_ind_i]]
            else:
                v_dend_e = v[seg_e[z_ind_e], t1_ind]
                v_dend_i = v[seg_i[z_ind_i], t1_ind]

            for k, (s, u) in enumerate(zip(s_e, v_dend_e)):
                if b_type_e[z_ind_e[k]] == 2:
                    f_e[z_ind_e[k]] += kernels.eval_poly(s, u, p_ea)
                else:
                    f_e[z_ind_e[k]] += kernels.eval_poly(s, u, p_eb)
            for k, (s, u) in enumerate(zip(s_i, v_dend_i)):
                if b_type_i[z_ind_i[k]] == 2:
                    f_i[z_ind_i[k]] += kernels.eval_poly(s, u, p_ia)
                else:
                    f_i[z_ind_i[k]] += kernels.eval_poly(s, u, p_ib)
    return f_e, f_i