: Weight adjuster portion based on stdwa_songabbott.mod in ModeDB 64261 : Conductance portion based on Exp2Syn. : This model is intended for use as the mitral side of the reciprocal : synapse and as such the pre events come from the granule side ThreshDetect : instance of the Mitral Granule Reciprocal Synapse (MGRS) with non-negative : weight (positive delay required), : and the post events come from the mitral side ThreshDetect instance : of the MGRS with negative weight (0 delay allowed). COMMENT Spike Timing Dependent Weight Adjuster based on Song and Abbott, 2001. Andrew Davison, UNIC, CNRS, 2003-2004 ENDCOMMENT NEURON { POINT_PROCESS FastInhibSTDP : conductance RANGE tau1, tau2, e, i NONSPECIFIC_CURRENT i RANGE gmax RANGE mgid, ggid, srcgid : weight adjuster RANGE interval, tlast_pre, tlast_post, M, P RANGE deltaw, wmax, aLTP, aLTD RANGE wsyn GLOBAL tauLTP, tauLTD, on } UNITS { (nA) = (nanoamp) (mV) = (millivolt) (uS) = (microsiemens) } PARAMETER { : conductance tau1=1 (ms) <1e-9,1e9> tau2 = 200 (ms) <1e-9,1e9> gmax = .003 (uS) e = -80 (mV) : weight adjuster tauLTP = 20 (ms) : decay time for LTP part ( values from ) tauLTD = 20 (ms) : decay time for LTD part ( Song and Abbott, 2001 ) wmax = 1 : min and max values of synaptic weight aLTP = 0.001 : amplitude of LTP steps aLTD = 0.00106 : amplitude of LTD steps on = 1 : allows learning to be turned on and off globally : administrative mgid = -1 : associated mitral gid ggid = -1 : associated granule gid srcgid = -1 : the gid of the granule detector } ASSIGNED { : conductance v (mV) i (nA) g (uS) factor : weight adjuster interval (ms) : since last spike of the other kind tlast_pre (ms) : time of last presynaptic spike tlast_post (ms) : time of last postsynaptic spike M : LTD function P : LTP function deltaw : change in weight wsyn : weight of the synapse } STATE { A B } INITIAL { : conductance LOCAL tp if (tau1/tau2 > .9999) { tau1 = .9999*tau2 } A = 0 B = 0 tp = (tau1*tau2)/(tau2 - tau1) * log(tau2/tau1) factor = -exp(-tp/tau1) + exp(-tp/tau2) factor = 1/factor : weight adjuster interval = 0 tlast_pre = 0 tlast_post = 0 M = 0 P = 0 deltaw = 0 wsyn = 0 } BREAKPOINT { SOLVE state METHOD cnexp g = (B - A)*gmax i = g*(v - e) } DERIVATIVE state { A' = -A/tau1 B' = -B/tau2 } NET_RECEIVE (w) { if (w >= 0) { : this is a pre-synaptic spike P = P*exp((tlast_pre-t)/tauLTP) + aLTP interval = tlast_post - t : interval is negative tlast_pre = t deltaw = wmax * M * exp(interval/tauLTD) } else { : this is a post-synaptic spike M = M*exp((tlast_post-t)/tauLTD) - aLTD interval = t - tlast_pre : interval is positive tlast_post = t deltaw = wmax * P * exp(-interval/tauLTP) } if (on) { wsyn = wsyn + deltaw if (wsyn > wmax) { wsyn = wmax } if (wsyn < 0) { wsyn = 0 } } A = A + wsyn*factor B = B + wsyn*factor }