load_file("writedata.hoc") // Allow periodic saving of data to disk print "Loading stdpscaling.hoc..." // stdpscaling.hoc // Mark Rowan, School of Computer Science, University of Birmingham, UK // September 2012 // Code to enable synaptic scaling whilst STDP is active (set in params.hoc; see below) // to investigate whether scaling helps to balance excitatory potentiation and // avoid transition to epilepsy. // ********************************************************************** // REQUIREMENTS: // run.hoc should have SPKSZ set to at least 1400e3 elements (assuming 800e3 ms segmentlength and 1 col) // run.hoc should have prl(0,1) as the last line in the file to turn off printlist recording // // params.hoc should have PreDur, LearnDur, PostDur and other params set appropriately // params.hoc should have TrairRate (training signal freq, Hz) set // params.hoc should have TrainW (training signal weight) set // // Other key values in params.hoc: // plastEEinc/plastEIinc/plastIEinc/plastIIinc -- increment amount for adding to weights // (in paper, these are 0.05, 0.10, 0.05, 0.05 respectively) // plastEEmaxw/plastEImaxw/plastIEmaxw/plastIImaxw -- max increase in weight from baseline // (in paper, these are 10, 15, 3, 3 respectively) // ********************************************************************** // **** User-settable parameters **** // Scaling params declare("scaling", 1) // Set to 1 to enable compensatory homeostatic synaptic scaling declare("activitytau", 100e3) // Activity sensor time constant declare("activitybeta", 4.0e-8) // Scaling weight declare("activitygamma", 1.0e-10) // Scaling integral controller weight declare("scalingstart", 800e3) // Time after which to begin synaptic scaling (needs to be long enough for the activity sensors to accurately estimate average firing rates) numcells = 470 * scale // Number of cells in the network (set in network.hoc:77 and :124) // Recording params declare("recording_interval", 10e3) // How many ms between scalefactor recordings declare("recording_start", 5e3) // Start recording scalefactors after this time // Define objects objref remainingcellIDs, randgen, deletionList, auxFile, varsFile strdef auxFileName strdef varsFileName proc setup() { // Initialise RNG randgen = new Random() // Set scaling parameters in INTF6 col.ce.o(0).setactivitytau(activitytau) col.ce.o(0).setactivitygamma(activitygamma) col.ce.o(0).setactivitybeta(activitybeta) // Create data file // filepath should already have been allocated in writedata.hoc sprint(auxFileName, "%s/%s", filepath, "aux") sprint(varsFileName, "%s/%s", filepath, "vars") auxFile = new File(auxFileName) varsFile = new File(varsFileName) header_written = 0 // Instruct write_scaling_data() to write vars file header } proc turn_on_scaling() { if (scaling) { printf("Turning on synaptic scaling\n") col.ce.o(0).setscaling(1) } } proc write_scaling_data() { local k, id, act, trg, scl, type, dead if (!header_written) { // Write vars file header varsFile.aopen() varsFile.printf("# ************* Runtime params *************\n") varsFile.printf("buffertime=%d\n", buffertime) varsFile.printf("numcells=%d\n", numcells) varsFile.printf("scaling=%d\n", scaling) varsFile.printf("scalingstart=%d\n", scalingstart) varsFile.printf("recording_interval=%d\n", recording_interval) varsFile.printf("t_start=%d\n", recording_start) varsFile.printf("activitytau=%e\n", activitytau) varsFile.printf("activitybeta=%e\n", activitybeta) varsFile.printf("activitygamma=%e\n", activitygamma) varsFile.printf("\n# Cell ID, cell type, activity sensor, target activity, scaling factor, is-dead\n") varsFile.printf("# Recorded every %d ms\n", recording_interval) varsFile.close() header_written = 1 } // Open aux file for append auxFile.aopen() // Record current time auxFile.printf("t = %f\n", t) // Write data to given file for k=0,numcells-1 { id = col.ce.o(k).get_id() act = col.ce.o(k).get_activity() trg = col.ce.o(k).get_target_act() scl = col.ce.o(k).get_scale_factor() type = col.ce.o(k).get_type() dead = col.ce.o(k).get_dead() auxFile.printf("%d,%d,%f,%f,%f,%d\n", id,type,act,trg,scl,dead) //printf("%d,%d,%f,%f,%f,%d\n", id,type,act,trg,scl,dead) } // Close file auxFile.close() // Queue next event cvode.event(t+recording_interval, "write_scaling_data()") } // Callback procedure to start the event queue // NOTE: Only called once, after hoc file initialised and run() has been called proc stdpscalingeventqueue() { cvode.event(scalingstart, "turn_on_scaling()") // Start scaling after initial delay to find activity cvode.event(t + recording_start, "write_scaling_data()") // Start recording of scalefactors etc } setup() declare("stdpfih", new FInitializeHandler("stdpscalingeventqueue()")) // Called as soon as INIT finishes