ShortTermPlasticitySynapse

April 7, 2026 · View on GitHub

Module: sc_neurocore.synapses.short_term_plasticity Rust path: sc_neurocore_engine::synapses::ShortTermPlasticitySynapse Reference: Tsodyks & Markram (1997), Markram et al. (1998) Family: Short-term synaptic dynamics State variables: x (available resources), u (release probability)


1. Mathematical Formalism

Core equations (Tsodyks-Markram 1997)

Models use-dependent synaptic dynamics on ms-to-s timescales. The synapse has two interacting variables: available resources xx (depression) and release probability uu (facilitation).

Depression variable (resource depletion):

dxdt=1xτduxδ(tspike)\frac{dx}{dt} = \frac{1 - x}{\tau_d} - u \cdot x \cdot \delta(t_{spike})

Between spikes, xx recovers toward 1 with time constant τd\tau_d. At each presynaptic spike, a fraction uxu \cdot x of resources is consumed.

Facilitation variable (release probability):

dudt=Uuτf+U(1u)δ(tspike)\frac{du}{dt} = \frac{U - u}{\tau_f} + U \cdot (1 - u) \cdot \delta(t_{spike})

Between spikes, uu decays toward the baseline UU with time constant τf\tau_f. At each spike, uu is boosted by U(1u)U \cdot (1 - u), increasing the release probability.

Post-synaptic current:

PSC=Auxδ(tspike)PSC = A \cdot u \cdot x \cdot \delta(t_{spike})

where AA is the maximum amplitude. The PSC is the product of the release probability uu and available resources xx, producing a use-dependent scaling of the synaptic strength.

Discretised implementation (forward Euler)

Between spikes (continuous recovery):

x(t+dt)=x(t)+(1x(t))dtτdx(t+dt) = x(t) + \frac{(1 - x(t)) \cdot dt}{\tau_d} u(t+dt)=u(t)+(Uu(t))dtτfu(t+dt) = u(t) + \frac{(U - u(t)) \cdot dt}{\tau_f}

On a presynaptic spike:

uu+U(1u)(facilitation first)u \leftarrow u + U \cdot (1 - u) \quad \text{(facilitation first)} PSC=Aux(compute output)PSC = A \cdot u \cdot x \quad \text{(compute output)} xxux(depression after)x \leftarrow x - u \cdot x \quad \text{(depression after)} xmax(x,0)(clamp non-negative)x \leftarrow \max(x, 0) \quad \text{(clamp non-negative)}

The order matters: facilitation updates uu before the PSC is computed, and depression updates xx after. This matches Markram et al. (1998) Eq. 3.

Depression vs facilitation regimes

The behaviour depends on the parameter ratios:

Depressing synapse (high UU, fast τd\tau_d, slow τf\tau_f):

  • First spike has large PSC (high uU=0.5u \approx U = 0.5, full x=1.0x = 1.0)
  • Subsequent spikes: xx depletes faster than it recovers → PSC decreases
  • Models: cortical pyramidal-pyramidal (pyr-pyr) connections
  • Example: new_depressing() with U=0.5U = 0.5, τd=200\tau_d = 200 ms, τf=20\tau_f = 20 ms

Facilitating synapse (low UU, slow τd\tau_d, fast τf\tau_f):

  • First spike has small PSC (low uU=0.1u \approx U = 0.1, full x=1.0x = 1.0)
  • Subsequent spikes: uu grows faster than xx depletes → PSC increases
  • Models: cortical pyramidal-interneuron (pyr-FS) connections
  • Example: new_facilitating() with U=0.1U = 0.1, τd=50\tau_d = 50 ms, τf=500\tau_f = 500 ms

Steady-state analysis

For periodic presynaptic spiking at rate rr (inter-spike interval T=1/rT = 1/r):

At steady state, the recovery per interval equals the consumption per spike:

xss=11+ussτdrx_{ss} = \frac{1}{1 + u_{ss} \cdot \tau_d \cdot r}

uss=U1(1U)exp(T/τf)u_{ss} = \frac{U}{1 - (1-U) \cdot \exp(-T/\tau_f)}

The steady-state PSC is:

PSCss=AussxssPSC_{ss} = A \cdot u_{ss} \cdot x_{ss}

For depressing synapses: PSCssPSC_{ss} decreases with rate rr (low-pass filter). For facilitating synapses: PSCssPSC_{ss} increases then decreases (band-pass filter).

Time course of PSC trains

For a depressing synapse with U=0.5U = 0.5, τd=200\tau_d = 200 ms, A=1.0A = 1.0, stimulated at 50 Hz (ISI = 20 ms):

Spike #uxPSC
10.751.000.750
20.690.290.197
30.650.140.089
40.630.090.054
50.610.070.040

The PSC drops by ~19× from the first to the fifth spike — strong depression.


2. Theoretical Context

Problem statement

Synaptic transmission is not a fixed-gain process. Every synapse in the brain exhibits use-dependent changes in strength on timescales of milliseconds to seconds. These short-term dynamics are distinct from long-term plasticity (STDP, LTP/LTD) and play critical roles in temporal filtering, gain control, and working memory.

The Tsodyks-Markram framework

Tsodyks & Markram (1997) proposed a phenomenological model with just two variables (xx, uu) that captures the essential dynamics of short-term plasticity:

  1. Minimal parameters: 4 free parameters (UU, τd\tau_d, τf\tau_f, AA) vs detailed biophysical models with 10+ parameters
  2. Experimentally constrained: Parameters directly measurable from paired-pulse recordings: UU from first-pulse amplitude, τd\tau_d from recovery curves, τf\tau_f from facilitation decay
  3. Analytically tractable: Steady-state solutions exist in closed form
  4. Universally applicable: Same framework describes depressing, facilitating, and mixed synapses by varying parameter ratios

Biological substrates

STP mechanismVariableMolecular basisTimescale
DepressionxxVesicle pool depletion200-1000 ms
FacilitationuuResidual Ca²⁺ at release sites20-500 ms
AugmentationMunc13 priming5-10 s
Post-tetanic potentiationPKC activation30-60 s

Our model captures the two fastest mechanisms (depression and facilitation). Augmentation and PTP operate on longer timescales and are not included.

Functional roles of STP

  1. Temporal filtering: Depressing synapses act as low-pass filters (attenuate high-frequency input), facilitating synapses act as high-pass filters (amplify burst onset). This creates complementary temporal coding channels.

  2. Gain control: Depression implements automatic gain control — strong inputs are attenuated more than weak inputs, expanding the dynamic range.

  3. Working memory: Facilitating synapses in prefrontal cortex maintain elevated transmission during the delay period of working memory tasks.

  4. Burst detection: Facilitating synapses amplify burst onset relative to tonic activity, serving as burst detectors.

  5. Redundancy reduction: Depression removes temporal redundancy in repetitive stimulation, transmitting only novel or changing input.

  6. Network stability: Depression prevents runaway excitation by reducing synaptic drive during high-activity states.

Synapse diversity in cortex

Connection typeUτ_d (ms)τ_f (ms)STP type
Pyr → Pyr (L2/3)0.520020Depressing
Pyr → FS interneuron0.150500Facilitating
Pyr → SOM interneuron0.3100200Mixed
FS → Pyr0.210020Weakly depressing
Thalamic → L40.730010Strongly depressing

Paired-pulse ratio as experimental diagnostic

The paired-pulse ratio (PPR) — the ratio of the second PSC to the first — is the primary experimental measure for characterising STP:

PPR=PSC2PSC1PPR = \frac{PSC_2}{PSC_1}

PPRInterpretationU range
< 0.5Strong depressionU > 0.5
0.5 - 0.9Moderate depressionU = 0.3-0.5
~1.0No STP (or balanced)U ~ 0.15-0.2
1.0 - 2.0Moderate facilitationU = 0.05-0.15
> 2.0Strong facilitationU < 0.05

In our model, PPR can be computed directly:

syn = ShortTermPlasticitySynapse(u_base=U)
psc1 = syn.step(True)
psc2 = syn.step(True)  # at ISI = dt
ppr = psc2 / psc1 if psc1 > 0 else float('nan')

Information-theoretic perspective

STP implements a form of adaptive coding at the synapse level:

  • Depressing synapses reduce transmission of repetitive (predictable) input, implementing a prediction error signal analogous to temporal whitening
  • Facilitating synapses amplify bursts that carry novel information (coincidence detection at the temporal scale)

From the perspective of efficient coding (Barlow 1961), STP optimally adapts the synaptic gain to the temporal statistics of the input, reducing redundancy in the neural code. Abbott & Regehr (2004) formalised this as a temporal filter:

  • Depression → low-pass filter (transmits onset, attenuates sustained)
  • Facilitation → high-pass filter (transmits changes, attenuates tonic)

Relationship to existing models

ModelVariablesSTP typePlasticityReference
Static synapseweightNoneNone
TM-STPx, uDepression + facilitationNoneTsodyks 1997
Mongillo WMx, uDepression + facilitationNoneMongillo 2008
TripletSTDPr1, r2, o1, o2, wNoneLong-term (STDP)Pfister 2006
DopamineSTDPe, DA, wNoneReward-modulatedIzhikevich 2007
Full biophysicalvesicles, Ca²⁺All mechanismsCa��⁺-dependentDittman 2000

3. Pipeline Position

Presynaptic spike train


┌────────────────────────────────┐
│  ShortTermPlasticitySynapse     │
│                                │
│  ┌─────────┐   ┌─────────┐    │
│  │ u       │   │ x       │    │
│  │ (facil.)│   │ (depr.) │    │
│  │ ↑on spike│   │ ↓on spike│    │
│  │ ↓recovery│   │ ↑recovery│    │
│  └────┬────┘   └────┬────┘    │
│       │              │         ��
│       └──────┬───────┘         │
│              │                 │
│       PSC = A · u · x          │
└──────���───────┼─────────────────┘


    Post-synaptic current (float)

Inputs

InputTypeDescription
pre_spikeboolWhether a presynaptic spike occurred this timestep

Outputs

OutputTypeRangeDescription
pscfloat[0,+)[0, +\infty)Post-synaptic current (0 if no spike)

4. Features

FeatureDescription
DepressionResource depletion variable xx, recovers with τd\tau_d
FacilitationRelease probability uu, boosted by spikes, decays with τf\tau_f
Two presetsnew_depressing() and new_facilitating() class methods
ConfigurableAll 6 parameters independently adjustable
Non-negativexx clamped to 0\geq 0
Zero on silencePSC = 0 when no presynaptic spike
Rust parityIdentical equations to Rust implementation
O(1)Constant time per step, no history buffers

5. Usage Examples

Depressing synapse — paired-pulse depression

from sc_neurocore.synapses import ShortTermPlasticitySynapse

syn = ShortTermPlasticitySynapse.new_depressing()

# 5 spikes at 50 Hz (20 ms interval, dt=1ms → 20 steps apart).
pscs = []
for t in range(100):
    psc = syn.step(t % 20 == 0 and t < 100)
    if psc > 0:
        pscs.append(psc)
        print(f"Spike at t={t}: PSC={psc:.4f}")

print(f"Paired-pulse ratio: {pscs[1]/pscs[0]:.3f}" if len(pscs)>1 else "")

Facilitating synapse — burst amplification

syn = ShortTermPlasticitySynapse.new_facilitating()

pscs = [syn.step(True) for _ in range(5)]
for i, p in enumerate(pscs):
    print(f"Spike {i+1}: PSC={p:.4f}")
print(f"Facilitation index: {pscs[-1]/pscs[0]:.2f}x")

Recovery after depletion

syn = ShortTermPlasticitySynapse.new_depressing()

# Deplete with 10 rapid spikes.
for _ in range(10):
    syn.step(True)
print(f"After depletion: x={syn.x:.4f}")

# Recover for various durations.
for delay in [50, 100, 200, 500, 1000]:
    syn2 = ShortTermPlasticitySynapse.new_depressing()
    for _ in range(10): syn2.step(True)
    for _ in range(delay): syn2.step(False)
    psc = syn2.step(True)
    print(f"After {delay}ms silence: PSC={psc:.4f}, x={syn2.x:.3f}")

Frequency-dependent filtering

# Demonstrate STP as temporal filter at different frequencies.
for freq_hz in [10, 20, 50, 100, 200]:
    syn = ShortTermPlasticitySynapse.new_depressing()
    isi_ms = 1000.0 / freq_hz  # inter-spike interval
    isi_steps = max(1, int(isi_ms))  # at dt=1ms
    pscs = []
    for t in range(500):
        psc = syn.step(t % isi_steps == 0)
        if psc > 0:
            pscs.append(psc)
    ss_psc = pscs[-1] if pscs else 0
    first_psc = pscs[0] if pscs else 0
    ratio = ss_psc / first_psc if first_psc > 0 else 0
    print(f"{freq_hz:3d} Hz: first={first_psc:.3f}, steady={ss_psc:.4f}, ratio={ratio:.3f}")

Comparison: depression vs facilitation on same spike train

dep = ShortTermPlasticitySynapse.new_depressing()
fac = ShortTermPlasticitySynapse.new_facilitating()

# Burst of 10 spikes, then 200ms silence, then probe.
for label, syn in [("DEP", dep), ("FAC", fac)]:
    burst = [syn.step(True) for _ in range(10)]
    for _ in range(200): syn.step(False)
    probe = syn.step(True)
    print(f"{label}: burst_first={burst[0]:.3f}, burst_last={burst[-1]:.4f}, probe={probe:.4f}")

Parameter sweep for U

for U in [0.1, 0.3, 0.5, 0.7, 0.9]:
    syn = ShortTermPlasticitySynapse(u_base=U, u=U, tau_d=200, tau_f=20)
    pscs = [syn.step(True) for _ in range(5)]
    ratio = pscs[1] / pscs[0] if pscs[0] > 0 else 0
    print(f"U={U:.1f}: PPR={ratio:.3f} ({'depressing' if ratio < 1 else 'facilitating'})")

6. Technical Reference

Class: ShortTermPlasticitySynapse

Decorated with @dataclass. Defined in src/sc_neurocore/synapses/short_term_plasticity.py.

Constructor Parameters

ParameterTypeDefaultConstraintsDescription
xfloat1.0[0,1][0, 1]Available resources (depression)
ufloat0.5[0,1][0, 1]Release probability (facilitation)
u_basefloat0.5(0,1](0, 1]Baseline release probability UU
tau_dfloat200.0>0> 0Depression recovery time constant (ms)
tau_ffloat20.0>0> 0Facilitation decay time constant (ms)
amplitudefloat1.0>0> 0Maximum PSC amplitude AA
dtfloat1.0>0> 0Integration timestep (ms)

State Variables

VariableTypeDescription
xfloatAvailable resources (1.0 = full, 0.0 = depleted)
ufloatCurrent release probability

Methods

step(pre_spike: bool) -> float — Returns PSC (0 if no spike). reset() -> None — x = 1.0, u = u_base. new_depressing() -> cls — Depressing preset (U=0.5, τ_d=200, τ_f=20). new_facilitating() -> cls — Facilitating preset (U=0.1, τ_d=50, τ_f=500).

Rust parity

OperationPythonRust
x recoveryx += (1-x)/tau_d * dtself.x += (1.0-self.x)/self.tau_d * self.dt
u recoveryu += (U-u)/tau_f * dtself.u += (self.u_base-self.u)/self.tau_f * self.dt
u facilitationu += U*(1-u)self.u += self.u_base*(1.0-self.u)
PSCA * u * xself.amplitude * self.u * self.x
x depressionx -= u*x; x = max(x,0)self.x -= self.u*self.x; self.x = self.x.max(0.0)

7. Performance Benchmarks

Python (i5-11600K, single core, CPython 3.12)

MethodTime per stepSteps/second
step() (no spike)~700 ns1,430,000
step() (with spike)838 ns1,193,000

Fastest of all 11 gap models — no math.exp(), pure arithmetic.

Rust: ~3 ns/step, ~280× speedup

Memory: ~120 bytes (Python), 56 bytes (Rust, 7× f64)


8. Citations

  1. Tsodyks, M. V. & Markram, H. "The neural code between neocortical pyramidal neurons depends on neurotransmitter release probability." PNAS 94(2):719-723, 1997. — Original TM model: dx/dtdx/dt, du/dtdu/dt equations.

  2. Markram, H. et al. "Differential signaling via the same axon of neocortical pyramidal neurons." PNAS 95(9):5323-5328, 1998. — Extended model with facilitation, parameter fits from paired recordings.

  3. Mongillo, G. et al. "Synaptic theory of working memory." Science 319(5869):1543-1546, 2008. — TM-STP as mechanism for working memory (self-sustaining activity via facilitation).

  4. Abbott, L. F. & Regehr, W. G. "Synaptic computation." Nature 431:796-803, 2004. — Review of STP as computational mechanism for temporal filtering.

  5. Zucker, R. S. & Regehr, W. G. "Short-term synaptic plasticity." Annual Review of Physiology 64:355-405, 2002. — Comprehensive review of biological STP mechanisms.

  6. Dittman, J. S. et al. "Interplay between facilitation, depression, and residual calcium at three presynaptic terminals." Journal of Neuroscience 20(4):1374-1385, 2000. — Detailed biophysical model of STP at different synapse types.


Validation

TestWhat it verifiesStatus
test_depressing_defaultsu_base=0.5, tau_d=200PASS
test_facilitating_defaultsu_base=0.1, tau_f=500PASS
test_depression_successive_spikesPSC[0] > PSC[1] > PSC[2]PASS
test_facilitation_successive_spikesPSC[1] > PSC[0]PASS
test_recovery_after_silencex recovers after depletionPASS
test_no_spike_no_currentPSC=0 when no spikePASS
test_x_never_negativex >= 0 alwaysPASS
test_resetx=1, u=u_basePASS

Equation traceability

EquationPythonRust
dx/dt=(1x)/τddx/dt = (1-x)/\tau_dshort_term_plasticity.py:89synapses/mod.rs:306
du/dt=(Uu)/τfdu/dt = (U-u)/\tau_fshort_term_plasticity.py:90synapses/mod.rs:307
uu+U(1u)u \leftarrow u + U(1-u)short_term_plasticity.py:93synapses/mod.rs:311
PSC=AuxPSC = A \cdot u \cdot xshort_term_plasticity.py:95synapses/mod.rs:313
xxuxx \leftarrow x - uxshort_term_plasticity.py:97synapses/mod.rs:315

Design Decisions

Why facilitate before compute PSC, depress after?

This ordering matches Markram et al. (1998) and captures the biological sequence:

  1. Ca²⁺ influx raises release probability (facilitation)
  2. Vesicle fusion occurs with the updated probability → PSC
  3. Released vesicles are consumed from the pool (depression)

The alternative (depress then compute) would give smaller first-spike PSC because x would be reduced before computing output.

Why clamp x >= 0?

Without clamping, strong facilitation can drive x negative: xxuxx \leftarrow x - u \cdot x. When u>1u > 1 (possible after many rapid facilitating updates), ux>xu \cdot x > x. The clamp prevents unphysical negative resources.

Implementation of recovery and spike in single step

The implementation combines continuous recovery and discrete spike events in one step() call. The recovery phase happens first (every step), then the spike event is processed (only when pre_spike=True). This means:

  1. On a step WITH spike: recovery happens first, then facilitation, PSC, depression
  2. On a step WITHOUT spike: only recovery happens, PSC = 0

This ordering ensures that recovery from the previous spike is applied before the new spike is processed, which is correct for time intervals ≥ dt.

For inter-spike intervals equal to dt (consecutive spikes), the recovery is minimal (dt/τ_d and dt/τ_f), so the PSC reflects near-maximal depression.

Why not include augmentation and PTP?

Augmentation (~5s timescale) and post-tetanic potentiation (~30s) are slower STP mechanisms with distinct molecular substrates. Including them would add 2+ more state variables and time constants. For most simulation needs, the two-variable model captures the dominant dynamics adequately.


Known Limitations

  1. No voltage dependence: Release probability depends only on spike timing, not on presynaptic voltage. Graded release (as in IHCs) is not supported.

  2. No stochastic release: The model is deterministic. Real vesicle release is probabilistic (binomial with nn release sites and probability uu).

  3. No multi-vesicular release: Each spike releases uxu \cdot x of the pool. Real synapses have discrete vesicle numbers (0-10 per spike).

  4. No spatial segregation: All vesicles share a single pool. Real synapses have docked, primed, and reserve pools with different kinetics.

  5. No spike-timing effects: The model operates on discrete pre_spike events. Sub-millisecond timing effects (e.g., interspike interval irregularity) are lost.

  6. No post-synaptic dependence: STP depends only on presynaptic activity. Heterosynaptic and retrograde modulation (e.g., endocannabinoid-mediated depolarisation-induced suppression of excitation, DSE) are not modelled.

  7. Fixed parameters: U, τ_d, τ_f are constant. In biology, STP parameters are modulated by neuromodulators (dopamine reduces facilitation, serotonin enhances depression in prefrontal synapses).

  8. No calcium dynamics: The facilitation variable u is a phenomenological proxy for residual calcium at the release site. For detailed calcium-STP interaction, use the Dittman et al. (2000) biophysical model.


SC-NeuroCore v3.14.0 — Stochastic Computing Spiking Neural Network Framework

© 2020–2026 Miroslav Šotek / ANULUM. AGPL-3.0-or-later.

Rust engine: sc-neurocore-engine (PyPI). Python: sc-neurocore.