.. currentmodule:: brian

.. index::
   pair: example usage; NeuronGroup
   pair: example usage; run
   pair: example usage; PopulationRateMonitor
   pair: example usage; ExponentialSTDP
   pair: example usage; PoissonGroup
   pair: example usage; Connection
   pair: example usage; stdp

.. _example-plasticity_STDP2:

Example: STDP2 (plasticity)
===========================

Spike-timing dependent plasticity
Adapted from Song, Miller and Abbott (2000), Song and Abbott (2001)
and van Rossum et al (2000).

This simulation takes a long time!

::

    from brian import *
    from time import time
    
    N = 1000
    taum = 10 * ms
    tau_pre = 20 * ms
    tau_post = tau_pre
    Ee = 0 * mV
    vt = -54 * mV
    vr = -60 * mV
    El = -74 * mV
    taue = 5 * ms
    gmax = 0.01
    F = 15 * Hz
    dA_pre = .01
    dA_post = -dA_pre * tau_pre / tau_post * 2.5
    
    eqs_neurons = '''
    dv/dt=(ge*(Ee-vr)+El-v)/taum : volt   # the synaptic current is linearized
    dge/dt=-ge/taue : 1
    '''
    
    input = PoissonGroup(N, rates=F)
    neurons = NeuronGroup(1, model=eqs_neurons, threshold=vt, reset=vr)
    synapses = Connection(input, neurons, 'ge', weight=rand(len(input), len(neurons)) * gmax,
                        structure='dense')
    neurons.v = vr
    
    stdp = ExponentialSTDP(synapses, tau_pre, tau_post, dA_pre, dA_post, wmax=gmax, update='mixed')
    
    rate = PopulationRateMonitor(neurons)
    
    start_time = time()
    run(100 * second, report='text')
    print "Simulation time:", time() - start_time
    
    subplot(311)
    plot(rate.times / second, rate.smooth_rate(100 * ms))
    subplot(312)
    plot(synapses.W.todense() / gmax, '.')
    subplot(313)
    hist(synapses.W.todense() / gmax, 20)
    show()
    

