.. currentmodule:: brian2

.. Vogels_et_al_2011:

Example: Vogels_et_al_2011
==========================


        .. only:: html

            .. |launchbinder| image:: file:///usr/share/doc/python-brian-doc/docs/badge.svg
            .. _launchbinder: https://mybinder.org/v2/gh/brian-team/brian2-binder/master?filepath=examples/frompapers/Vogels_et_al_2011.ipynb

            .. note::
               You can launch an interactive, editable version of this
               example without installing any local files
               using the Binder service (although note that at some times this
               may be slow or fail to open): |launchbinder|_

        

Inhibitory synaptic plasticity in a recurrent network model
-----------------------------------------------------------
(F. Zenke, 2011) (from the 2012 Brian twister)

Adapted from:

Vogels, T. P., H. Sprekeler, F. Zenke, C. Clopath, and W. Gerstner.
Inhibitory Plasticity Balances Excitation and Inhibition in Sensory Pathways and Memory Networks.
Science (November 10, 2011).


::

    
    from brian2 import *
    
    # ###########################################
    # Defining network model parameters
    # ###########################################
    
    NE = 8000          # Number of excitatory cells
    NI = NE/4          # Number of inhibitory cells 
    
    tau_ampa = 5.0*ms   # Glutamatergic synaptic time constant
    tau_gaba = 10.0*ms  # GABAergic synaptic time constant
    epsilon = 0.02      # Sparseness of synaptic connections
    
    tau_stdp = 20*ms    # STDP time constant
    
    simtime = 10*second # Simulation time
    
    # ###########################################
    # Neuron model
    # ###########################################
    
    gl = 10.0*nsiemens   # Leak conductance
    el = -60*mV          # Resting potential
    er = -80*mV          # Inhibitory reversal potential
    vt = -50.*mV         # Spiking threshold
    memc = 200.0*pfarad  # Membrane capacitance
    bgcurrent = 200*pA   # External current
    
    eqs_neurons='''
    dv/dt=(-gl*(v-el)-(g_ampa*v+g_gaba*(v-er))+bgcurrent)/memc : volt (unless refractory)
    dg_ampa/dt = -g_ampa/tau_ampa : siemens
    dg_gaba/dt = -g_gaba/tau_gaba : siemens
    '''
    
    # ###########################################
    # Initialize neuron group
    # ###########################################
    
    neurons = NeuronGroup(NE+NI, model=eqs_neurons, threshold='v > vt',
                          reset='v=el', refractory=5*ms, method='euler')
    Pe = neurons[:NE]
    Pi = neurons[NE:]
    
    # ###########################################
    # Connecting the network 
    # ###########################################
    
    con_e = Synapses(Pe, neurons, on_pre='g_ampa += 0.3*nS')
    con_e.connect(p=epsilon)
    con_ii = Synapses(Pi, Pi, on_pre='g_gaba += 3*nS')
    con_ii.connect(p=epsilon)
    
    # ###########################################
    # Inhibitory Plasticity
    # ###########################################
    
    eqs_stdp_inhib = '''
    w : 1
    dApre/dt=-Apre/tau_stdp : 1 (event-driven)
    dApost/dt=-Apost/tau_stdp : 1 (event-driven)
    '''
    alpha = 3*Hz*tau_stdp*2  # Target rate parameter
    gmax = 100               # Maximum inhibitory weight
    
    con_ie = Synapses(Pi, Pe, model=eqs_stdp_inhib,
                      on_pre='''Apre += 1.
                             w = clip(w+(Apost-alpha)*eta, 0, gmax)
                             g_gaba += w*nS''',
                      on_post='''Apost += 1.
                              w = clip(w+Apre*eta, 0, gmax)
                           ''')
    con_ie.connect(p=epsilon)
    con_ie.w = 1e-10
    
    # ###########################################
    # Setting up monitors
    # ###########################################
    
    sm = SpikeMonitor(Pe)
    
    # ###########################################
    # Run without plasticity
    # ###########################################
    eta = 0          # Learning rate
    run(1*second)
    
    # ###########################################
    # Run with plasticity
    # ###########################################
    eta = 1e-2          # Learning rate
    run(simtime-1*second, report='text')
    
    # ###########################################
    # Make plots
    # ###########################################
    
    i, t = sm.it
    subplot(211)
    plot(t/ms, i, 'k.', ms=0.25)
    title("Before")
    xlabel("")
    yticks([])
    xlim(0.8*1e3, 1*1e3)
    subplot(212)
    plot(t/ms, i, 'k.', ms=0.25)
    xlabel("time (ms)")
    yticks([])
    title("After")
    xlim((simtime-0.2*second)/ms, simtime/ms)
    show()
    

