Example application
A minimalistic main.cpp file is shown below. The circuit consist of a ganglion cell, a relay cell and one cortical cell. The simulation settings and kernel parameters are given in Config file. The output is .h5 file.
main.cpp
#include <iostream> #include <yaml-cpp/yaml.h> #include <lgnSimulator.h> using namespace std; using namespace lgnSimulator; int main(int argc, char* argv[]) { cout << "===== lgn-simulator =====" << endl; //read config file----------------------------------------------------------------------- YAML::Node cfg = YAML::LoadFile(argv[1]); //Output manager:--------------------------------------------------------- OutputManager outputManager(cfg["OutputManager"]["outputFilename"].as<std::string>()); //Integrator----------------------------------------------------------------------------- Integrator integrator = createIntegrator(cfg["grid"]); //Stim----------------------------------------------------------------------------------- unique_ptr<Grating> S = createGratingStimulus(&integrator, cfg["stimulus"]); //Ganglion cell:-------------------------------------------------------------------------- DOG Wg_s = createSpatialDOGKernel(cfg["ganglion"]["Wg"]); TemporalDelta Wg_t = createTemporalDeltaKernel(cfg["ganglion"]["Wt"]); SeparableKernel Wg(cfg["ganglion"]["w"].as<double>(), &Wg_s, &Wg_t); GanglionCell ganglion(&integrator, Wg, cfg["ganglion"]["R0"].as<double>()); //Relay cell: ------------------------------------------------------------------------------ RelayCell relay(&integrator, cfg["relay"]["R0"].as<double>()); // G -> R SpatialDelta Ks_rg = createSpatialDeltaKernel(cfg["relay"]["Krg"]["spatial"]); TemporalDelta Kt_rg = createTemporalDeltaKernel(cfg["relay"]["Krg"]["temporal"]); SeparableKernel Krg(cfg["relay"]["Krg"]["w"].as<double>(), &Ks_rg, &Kt_rg); // C -> R SpatialGaussian Ks_rc = createSpatialGaussianKernel(cfg["relay"]["Krc"]["spatial"]); TemporalDelta Kt_rc = createTemporalDeltaKernel(cfg["relay"]["Krc"]["temporal"]); SeparableKernel Krc(cfg["relay"]["Krc"]["w"].as<double>(), &Ks_rc, &Kt_rc); //Cortical cell: ----------------------------------------------------------------------------- HeavisideNonlinearity heavisideNonlinearity; CorticalCell cortical(&integrator, cfg["cortical"]["R0"].as<double>(), &heavisideNonlinearity); // R -> C SpatialDelta Ks_cr = createSpatialDeltaKernel(cfg["cortical"]["Kcr"]["spatial"]); TemporalDelta Kt_cr = createTemporalDeltaKernel(cfg["cortical"]["Kcr"]["temporal"]); SeparableKernel Kcr(cfg["cortical"]["Kcr"]["w"].as<double>(), &Ks_cr, &Kt_cr); //Connect neurons:------------------------------------------------------------------------------ relay.addGanglionCell(&ganglion, Krg); relay.addCorticalCell(&cortical, Krc); cortical.addRelayCell(&relay, Kcr); //Compute:-------------------------------------------------------------------------------------- S->computeFourierTransform(); S->computeSpatiotemporal(); relay.computeImpulseResponse(); relay.computeResponse(S.get()); //Write:----------------------------------------------------------------------------------------- outputManager.writeIntegratorProperties(integrator); outputManager.writeStimulusProperties(S.get()); outputManager.writeStimulus(S.get()); outputManager.writeResponse(relay); outputManager.writeImpulseResponse(relay); return 0; }
Config file
The config file is shown below. The number of spatial and temporal points is given by \( N_s = 2^{\texttt{ns}} \) and \( N_t = 2^{\texttt{nt}} \), respectively. The spatial and temporal grid spacing is set by \( \texttt{ds}\) and \( \texttt{dt}\), respectively. The stimulus settings consist of the contrast value \( \texttt{C}\), the mask size, orientation, phase, and grating frequency (spatial and temporal). \( \texttt{kId}\) and \( \texttt{wId}\) correspond to indices in the spatial and temporal frequency vectors. \( \texttt{kId=0}\) corresponds to spot stimulus and \( \texttt{wId=0}\) corresponds to a static stimulus.
The background activities are set by \( \texttt{R0}\), while the kernel weights are set by \( \texttt{w}\).
description: "config file"
#------------File manager settings-----------------#
OutputManager:
outputFilename: "out.h5"
#------------Integrator settings-----------------#
grid:
ns: 7
nt: 2
dt: &dt_id 1.0
ds: &ds_id 0.05
#------------Stimulus settings-------------------#
stimulus:
# Grating:
mask: "circle" #none/circle/cscircle/gaussian
C: 1.0
maskSize: 1 #deg
orientation: 0. #deg
phase: 0. #deg
kId: 7 #[-Ns/2, Ns/2 - 1]
wId: 0 #[-Nt/2, Nt/2 - 1]
#-------------Ganglion cell settings--------------#
ganglion:
R0 : 0
w: 1.0
Wg:
# DOG
a: 0.62
b: 1.26
c: 0.85
Wt:
# TemporalDelta
delay: 0
dt: *dt_id
#---------------Relay cell settings--------------#
relay:
R0 : 0
#Kernels
Krg:
w: 1.0
spatial:
#Spatial delta
ds: *ds_id
shift: [0, 0]
temporal:
# TemporalDelta
delay: 0
dt: *dt_id
Krc:
w: 0.5
spatial:
#Gauss
a: 0.2
temporal:
# TemporalDelta
delay: 0.
dt: *dt_id
#-------------Cortical cell settings--------------#
cortical:
R0 : 0.
Kcr:
w: 1.0
spatial:
#Spatial delta
ds: *ds_id
shift: [0, 0]
temporal:
# TemporalDelta
delay: 0.
dt: *dt_id