# Spike-timing-dependent plasticity¶

Note

The classes below are only working with the `Connection`

class.
Consider using the newer `Synapses`

class as a replacement, it
allows you to flexibily express plasticity rules in a very similar way to
the classes below. A single `Synapses`

object can therefore
completely replace the combination of `Connection`

+
`STDP`

, for example. See Synapses for more details.

Synaptic weights can be modified by spiking activity.
Weight modifications at a given synapse depend on the relative
timing between presynaptic and postsynaptic spikes. Down to the
biophysical level, there is a number of synaptic variables which
are continuously evolving according to some differential equations,
and those variables can be modified by presynaptic and postsynaptic
spikes. In spike-timing-dependent plasticity (STDP) rules, the synaptic weight
changes at the times of presynaptic and postsynaptic
spikes only, as a function of the other synaptic variables.
In Brian, an STDP rule can be specified by defining an
`STDP`

object, as in the following example:

```
eqs_stdp='''
dA_pre/dt=-A_pre/tau_pre : 1
dA_post/dt=-A_post/tau_post : 1
'''
stdp=STDP(myconnection,eqs=eqs_stdp,pre='A_pre+=dA_pre;w+=A_post',
post='A_post+=dA_post;w+=A_pre',wmax=gmax)
```

The `STDP`

object acts on the `Connection`

object
`myconnection`

. Equations of the synaptic variables are given in
a string (argument `eqs`

) as for defining neuron models.
When a presynaptic (postsynaptic) spike is received, the code
`pre`

(`post`

) is executed, where the special identifier
`w`

stands for the synaptic weight (from the specified
connection matrix). Optionally, an upper limit can be specified
for the synaptic weights (`wmax`

).

The example above defines an exponential STDP rule with hard bounds and all-to-all pair interactions.

## Current limitations¶

- The differential equations must be linear.
- Presynaptic and postsynaptic variables must not interact, that is, a variable cannot be modified by both presynaptic and postsynaptic spikes. However, synaptic weight modifications can depend on all variables.
- STDP currently works only with homogeneous delays, not heterogeneous ones.

### Exponential STDP¶

In many applications, the STDP function is piecewise exponential.
In that case, one can use the `ExponentialSTDP`

class:

```
stdp=ExponentialSTDP(connection,taup,taum,Ap,Am,wmax=gmax,interactions='all',update='additive')
```

Here the synaptic weight modification function is:

```
f(s) = Ap*exp(-s/taup) if s >0
Am*exp(s/taum) if s <0
```

where s is the time of the postsynaptic spike minus the time of the presynaptic spike.
The modification is generally relative to the maximum weight `wmax`

(see below).
The `interactions`

keyword determines
how pairs of pre/post synaptic spikes interact: `all`

if contributions from
all pairs are added, `nearest`

for only nearest neighbour interactions,
`nearest_pre`

if only the nearest presynaptic spike and all postsynaptic
spikes are taken into account and `nearest_post`

for the symmetrical situation.
The weight update can be `additive`

, i.e., w=w+wmax*f(s), or `multiplicative`

:
w=w+w*f(s) for depression (usually s<0) and w=w+(wmax-w)*f(s) for potentiation
(usually s>0). It can also be `mixed`

: multiplicative for depression, additive for
potentiation.

### Delays¶

By default, transmission delays are assumed to be axonal, i.e., synapses are located
on the soma: if the delay of the connection C is d, then presynaptic spikes act after
a delay d while postsynaptic spikes act immediately. This behaviour can be overriden with
the keywords `delay_pre`

and `delay_post`

, in both classes `STDP`

and
`Exponential STDP`

.