Synaptic scaling balances learning in a spiking model of neocortex (Rowan & Neymotin 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:147141
Learning in the brain requires complementary mechanisms: potentiation and activity-dependent homeostatic scaling. We introduce synaptic scaling to a biologically-realistic spiking model of neocortex which can learn changes in oscillatory rhythms using STDP, and show that scaling is necessary to balance both positive and negative changes in input from potentiation and atrophy. We discuss some of the issues that arise when considering synaptic scaling in such a model, and show that scaling regulates activity whilst allowing learning to remain unaltered.
Reference:
1 . Rowan MS, Neymotin SA (2013) Synaptic Scaling Balances Learning in a Spiking Model of Neocortex Adaptive and Natural Computing Algorithms, Tomassini M, Antonioni A, Daolio F, Buesser P, ed. pp.20
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell; Neocortex V1 interneuron basket PV GABA cell; Neocortex fast spiking (FS) interneuron; Neocortex spiny stellate cell; Neocortex spiking regular (RS) neuron; Neocortex spiking low threshold (LTS) neuron; Abstract integrate-and-fire adaptive exponential (AdEx) neuron;
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; Python;
Model Concept(s): Synaptic Plasticity; Long-term Synaptic Plasticity; Learning; STDP; Homeostasis;
Implementer(s): Lytton, William [bill.lytton at downstate.edu]; Neymotin, Sam [Samuel.Neymotin at nki.rfmh.org]; Rowan, Mark [m.s.rowan at cs.bham.ac.uk];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell; Neocortex V1 interneuron basket PV GABA cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
/
stdpscalingpaper
batchscripts
mod
README
alz.hoc
autotune.hoc *
basestdp.hoc *
batch.hoc *
batch2.hoc *
batchcommon
checkirreg.hoc *
clusterrun.sh
col.dot *
col.hoc *
comppowspec.hoc *
condisconcellfig.hoc *
condisconpowfig.hoc *
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
e2hubsdisconpow.hoc *
e2incconpow.hoc *
filtutils.hoc *
geom.hoc *
graphplug.hoc *
grvec.hoc *
init.hoc *
labels.hoc *
load.hoc *
local.hoc *
makepopspikenq.hoc *
matfftpowplug.hoc *
matpmtmplug.hoc *
matpmtmsubpopplug.hoc *
matspecplug.hoc *
network.hoc *
nload.hoc *
nqpplug.hoc *
nqs.hoc *
nqsnet.hoc *
nrnoc.hoc *
params.hoc
plot.py
plotbatch.sh
plotbatchcluster.sh
powchgtest.hoc *
python.hoc *
pywrap.hoc *
redE2.hoc *
run.hoc
runsim.sh
setup.hoc *
shufmua.hoc *
sim.hoc
simctrl.hoc *
spkts.hoc *
stats.hoc *
stdpscaling.hoc
syncode.hoc *
vsampenplug.hoc *
writedata.hoc
xgetargs.hoc *
                            
print "Loading writedata.hoc..."
// writedata.hoc
// Mark Rowan, School of Computer Science, University of Birmingham, UK
// March 2012

// Writes data in vit (and, possibly later, printlist and nqLFP) to disk
// periodically and flushes data from RAM, to enable very long simulations
// Data is stored in grvec format

// ***************************************************************************
// REQUIREMENTS:
// run.hoc should have SPKSZ at least large enough to hold all the spikes
// generated by the network in "buffertime" ms. With standard params, 15e3 ms
// produces around 25000 spikes in a one-column 940-cell model, so SPKSZ should
// be set to perhaps 35000.
//
// run.hoc should have the last line as prl(0,1) as currently printlist and
// nqLFP writing is not implemented, otherwise RAM usage will grow steadily as
// nqLFP / printlist object lists grow.
//
// params.hoc should have "declare("use_nqLFP",0)" to prevent massive nqLFP
// vectors being initialised within each cell in run.hoc:wrecon().
// ***************************************************************************

// Set frequency of write operations
declare("buffertime", 800e3) //16e3 // Write data to disk every buffertime ms of sim time



// Define objects
objref vitindexfile, vitdatafile // printlistvecfile, printlisttvecfile, nqLFPfile
strdef vitindexfilename, vitdatafilename // printlistvecfilename, printlisttvecfilename, nqLFPfilename
//strdef filepath // Needed if not passing filepath on the commandline. However, must be commented out if passing filepath on the commandline, or the supplied filepath will be overwritten by the strdef!

// Set up filenames
declare("filepath", "data") // Default save path (pass alternative paths to nrniv using '-c "filepath=..."' and ensure that 'strdef filepath' above is commented out)
sprint(vitindexfilename, "%s/%s", filepath, ".spks")
sprint(vitdatafilename, "%s/%s", filepath, "spks")
//sprint(printlistvecfilename, "%s%s%s", filepath, "printlist-vec", datetime)
//sprint(printlisttvecfilename, "%s%s%s", filepath, "printlist-tvec", datetime)
//sprint(nqLFPfilename, "%s%s%s", filepath, "nqLFP", datetime)

// Create files
vitindexfile = new File(vitindexfilename)
vitdatafile = new File(vitdatafilename)
//printlistvecfile = new File(printlistvecfilename)
//printlisttvecfile = new File(printlisttvecfilename)
//nqLFPfile = new File(nqLFPfilename)


proc writedata() { localobj vec

  // Open files for appending
  vitindexfile.aopen()
  vitdatafile.aopen()
  //printlistvecfile.aopen()
  //printlisttvecfile.aopen()
  //nqLFPfile.aopen()
  
  // Debug printouts (comment out for extra speed during write operations):
  printf("vit.vec has %d elements\n", vit.vec.size())
  vec = vit.vec.where("!=", 0)
  printf("writing %d elements\n", vec.size())

  // Write vitem object to file using grvec format
  // Can't just resize or delete/re-create Vectors, as the Vector pointers
  // are held by intf6.mod and are not reset to zero (so after x elements are
  // written and the Vector is resized, the next element will still be written
  // index x rather than beginning again at index 0).
  // Fortunately, intf6 provides a custom spike-to-file proc spkoutf:
  col.ce.o(0).spkoutf(vitindexfile,vitdatafile) // print spike and time data to file
  col.ce.o(0).spkoutf() // empty the spike data vectors and resize

  // printlist contains vitem objects (just like vit) so we need to loop through
  // printlist and write each object to file.
  // Currently not implemented as this requires a similar mechanism to
  // col.ce.o(0).spkoutf (above) but applied to the printlist objects.
  // nqLFP also currently not implemented.

  // Close files
  vitindexfile.close()
  vitdatafile.close()
  //printlistvecfile.close()
  //printlisttvecfile.close()
  //nqLFPfile.close()

  // Resize vit vectors to SPKSZ so they don't constantly shrink
  vit.resize(SPKSZ)

  // Empty each of the printlist and nqLFP vectors and reclaim memory
  //prlclr() // Call prlclr() in run.hoc to clear printlist -- may also stop recording though?
  //nqLFP.remove_all()
  //wrecon() // Call wrecon() in run.hoc which reinitialises nqLFP. Is this correct?

 // Put next data write event onto queue to occur after t + buffertime
 cvode.event(t + buffertime,"writedata()") 
}


//* seteventqueue - starts off the event queue
proc seteventqueue() {
  // If mytstop is not a direct multiple of buffertime, then some data will remain
  // unsaved at the end of the simulation. So we find the amount by which we bring
  // forward the first write operation, so that the last write operation occurs at
  // the same time as the end of the simulation, meaning that all data is saved.
  // mytstop % buffertime ensures that we catch all the data
  cvode.event(t + buffertime + (mytstop % buffertime),"writedata()") 
}
declare("fith",new FInitializeHandler("seteventqueue()")) // Called as soon as INIT finishes