From b8cac23d2478289430f47ef34256e1ce01adc7a3 Mon Sep 17 00:00:00 2001 From: "Randall C. O'Reilly" Date: Wed, 12 Jun 2024 05:01:33 -0700 Subject: [PATCH] implemented linear approximation method seems to work in simple ra25 test case.. will need to test in objrec next (which has diff params -- that's a challenge). --- axon/enumgen.go | 10 ++-- axon/gpu_hlsl/gpu_synca.hlsl | 4 +- axon/layerparams.go | 17 ++++++ axon/neuron.go | 11 +++- axon/pathparams.go | 24 +++++++- axon/rand.go | 4 +- axon/shaders/gpu_applyext.spv | Bin 25432 -> 25436 bytes axon/shaders/gpu_betweengi.spv | Bin 26660 -> 26664 bytes axon/shaders/gpu_cycle.spv | Bin 105844 -> 106524 bytes axon/shaders/gpu_cyclepost.spv | Bin 132568 -> 132572 bytes axon/shaders/gpu_dwt.spv | Bin 94492 -> 94300 bytes axon/shaders/gpu_dwtfmdi.spv | Bin 13792 -> 14496 bytes axon/shaders/gpu_dwtsubmean.spv | Bin 30796 -> 31504 bytes axon/shaders/gpu_gather.spv | Bin 41236 -> 41928 bytes axon/shaders/gpu_laygi.spv | Bin 31044 -> 31048 bytes axon/shaders/gpu_minusneuron.spv | Bin 5372 -> 5356 bytes axon/shaders/gpu_minuspool.spv | Bin 29188 -> 29192 bytes axon/shaders/gpu_newstate_neuron.spv | Bin 35916 -> 36368 bytes axon/shaders/gpu_newstate_pool.spv | Bin 35420 -> 36128 bytes axon/shaders/gpu_plusneuron.spv | Bin 35448 -> 35468 bytes axon/shaders/gpu_plusstart.spv | Bin 24256 -> 24260 bytes axon/shaders/gpu_poolgi.spv | Bin 31720 -> 31724 bytes axon/shaders/gpu_postspike.spv | Bin 44584 -> 44588 bytes axon/shaders/gpu_sendspike.spv | Bin 52700 -> 53408 bytes axon/shaders/gpu_synca.spv | Bin 58232 -> 58980 bytes axon/shaders/gpu_wtfmdwt.spv | Bin 16380 -> 17084 bytes axon/typegen.go | 2 - go.mod | 1 + go.sum | 2 + kinase/linear.go | 84 ++++++++++++--------------- kinase/linear_test.go | 20 +++++++ kinase/params.go | 37 ++++++++++++ kinase/typegen.go | 10 +++- 33 files changed, 164 insertions(+), 62 deletions(-) create mode 100644 kinase/linear_test.go diff --git a/axon/enumgen.go b/axon/enumgen.go index b5861893a..abe9eb8dc 100644 --- a/axon/enumgen.go +++ b/axon/enumgen.go @@ -264,16 +264,16 @@ func (i *NeuronFlags) UnmarshalText(text []byte) error { return enums.UnmarshalText(i, text, "NeuronFlags") } -var _NeuronVarsValues = []NeuronVars{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83} +var _NeuronVarsValues = []NeuronVars{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87} // NeuronVarsN is the highest valid value for type NeuronVars, plus one. -const NeuronVarsN NeuronVars = 84 +const NeuronVarsN NeuronVars = 88 -var _NeuronVarsValueMap = map[string]NeuronVars{`Spike`: 0, `Spiked`: 1, `Act`: 2, `ActInt`: 3, `ActM`: 4, `ActP`: 5, `Ext`: 6, `Target`: 7, `Ge`: 8, `Gi`: 9, `Gk`: 10, `Inet`: 11, `Vm`: 12, `VmDend`: 13, `ISI`: 14, `ISIAvg`: 15, `CaSpkP`: 16, `CaSpkD`: 17, `CaSyn`: 18, `CaSpkM`: 19, `CaSpkPM`: 20, `CaLrn`: 21, `NrnCaM`: 22, `NrnCaP`: 23, `NrnCaD`: 24, `CaDiff`: 25, `RLRate`: 26, `SpkMaxCa`: 27, `SpkMax`: 28, `SpkPrv`: 29, `SpkSt1`: 30, `SpkSt2`: 31, `GeNoiseP`: 32, `GeNoise`: 33, `GiNoiseP`: 34, `GiNoise`: 35, `GeExt`: 36, `GeRaw`: 37, `GeSyn`: 38, `GiRaw`: 39, `GiSyn`: 40, `SMaintP`: 41, `GeInt`: 42, `GeIntNorm`: 43, `GiInt`: 44, `GModRaw`: 45, `GModSyn`: 46, `GMaintRaw`: 47, `GMaintSyn`: 48, `SSGi`: 49, `SSGiDend`: 50, `Gak`: 51, `MahpN`: 52, `Gmahp`: 53, `SahpCa`: 54, `SahpN`: 55, `Gsahp`: 56, `GknaMed`: 57, `GknaSlow`: 58, `KirM`: 59, `Gkir`: 60, `GnmdaSyn`: 61, `Gnmda`: 62, `GnmdaMaint`: 63, `GnmdaLrn`: 64, `NmdaCa`: 65, `GgabaB`: 66, `GABAB`: 67, `GABABx`: 68, `Gvgcc`: 69, `VgccM`: 70, `VgccH`: 71, `VgccCa`: 72, `VgccCaInt`: 73, `SKCaIn`: 74, `SKCaR`: 75, `SKCaM`: 76, `Gsk`: 77, `Burst`: 78, `BurstPrv`: 79, `CtxtGe`: 80, `CtxtGeRaw`: 81, `CtxtGeOrig`: 82, `NrnFlags`: 83} +var _NeuronVarsValueMap = map[string]NeuronVars{`Spike`: 0, `Spiked`: 1, `Act`: 2, `ActInt`: 3, `ActM`: 4, `ActP`: 5, `Ext`: 6, `Target`: 7, `Ge`: 8, `Gi`: 9, `Gk`: 10, `Inet`: 11, `Vm`: 12, `VmDend`: 13, `ISI`: 14, `ISIAvg`: 15, `CaSpkM`: 16, `CaSpkP`: 17, `CaSpkD`: 18, `CaSyn`: 19, `CaSpkPM`: 20, `CaLrn`: 21, `NrnCaM`: 22, `NrnCaP`: 23, `NrnCaD`: 24, `CaDiff`: 25, `RLRate`: 26, `SpkMaxCa`: 27, `SpkBin0`: 28, `SpkBin1`: 29, `SpkBin2`: 30, `SpkBin3`: 31, `SpkMax`: 32, `SpkPrv`: 33, `SpkSt1`: 34, `SpkSt2`: 35, `GeNoiseP`: 36, `GeNoise`: 37, `GiNoiseP`: 38, `GiNoise`: 39, `GeExt`: 40, `GeRaw`: 41, `GeSyn`: 42, `GiRaw`: 43, `GiSyn`: 44, `SMaintP`: 45, `GeInt`: 46, `GeIntNorm`: 47, `GiInt`: 48, `GModRaw`: 49, `GModSyn`: 50, `GMaintRaw`: 51, `GMaintSyn`: 52, `SSGi`: 53, `SSGiDend`: 54, `Gak`: 55, `MahpN`: 56, `Gmahp`: 57, `SahpCa`: 58, `SahpN`: 59, `Gsahp`: 60, `GknaMed`: 61, `GknaSlow`: 62, `KirM`: 63, `Gkir`: 64, `GnmdaSyn`: 65, `Gnmda`: 66, `GnmdaMaint`: 67, `GnmdaLrn`: 68, `NmdaCa`: 69, `GgabaB`: 70, `GABAB`: 71, `GABABx`: 72, `Gvgcc`: 73, `VgccM`: 74, `VgccH`: 75, `VgccCa`: 76, `VgccCaInt`: 77, `SKCaIn`: 78, `SKCaR`: 79, `SKCaM`: 80, `Gsk`: 81, `Burst`: 82, `BurstPrv`: 83, `CtxtGe`: 84, `CtxtGeRaw`: 85, `CtxtGeOrig`: 86, `NrnFlags`: 87} -var _NeuronVarsDescMap = map[NeuronVars]string{0: `Spike is whether neuron has spiked or not on this cycle (0 or 1)`, 1: `Spiked is 1 if neuron has spiked within the last 10 cycles (msecs), corresponding to a nominal max spiking rate of 100 Hz, 0 otherwise -- useful for visualization and computing activity levels in terms of average spiked levels.`, 2: `Act is rate-coded activation value reflecting instantaneous estimated rate of spiking, based on 1 / ISIAvg. This drives feedback inhibition in the FFFB function (todo: this will change when better inhibition is implemented), and is integrated over time for ActInt which is then used for performance statistics and layer average activations, etc. Should not be used for learning or other computations.`, 3: `ActInt is integrated running-average activation value computed from Act with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall activation state across the ThetaCycle time scale, as the overall response of network to current input state -- this is copied to ActM and ActP at the ends of the minus and plus phases, respectively, and used in computing performance-level statistics (which are typically based on ActM). Should not be used for learning or other computations.`, 4: `ActM is ActInt activation state at end of third quarter, representing the posterior-cortical minus phase activation -- used for statistics and monitoring network performance. Should not be used for learning or other computations.`, 5: `ActP is ActInt activation state at end of fourth quarter, representing the posterior-cortical plus_phase activation -- used for statistics and monitoring network performance. Should not be used for learning or other computations.`, 6: `Ext is external input: drives activation of unit from outside influences (e.g., sensory input)`, 7: `Target is the target value: drives learning to produce this activation value`, 8: `Ge is total excitatory conductance, including all forms of excitation (e.g., NMDA) -- does *not* include Gbar.E`, 9: `Gi is total inhibitory synaptic conductance -- the net inhibitory input to the neuron -- does *not* include Gbar.I`, 10: `Gk is total potassium conductance, typically reflecting sodium-gated potassium currents involved in adaptation effects -- does *not* include Gbar.K`, 11: `Inet is net current produced by all channels -- drives update of Vm`, 12: `Vm is membrane potential -- integrates Inet current over time`, 13: `VmDend is dendritic membrane potential -- has a slower time constant, is not subject to the VmR reset after spiking`, 14: `ISI is current inter-spike-interval -- counts up since last spike. Starts at -1 when initialized.`, 15: `ISIAvg is average inter-spike-interval -- average time interval between spikes, integrated with ISITau rate constant (relatively fast) to capture something close to an instantaneous spiking rate. Starts at -1 when initialized, and goes to -2 after first spike, and is only valid after the second spike post-initialization.`, 16: `CaSpkP is continuous cascaded integration of CaSpkM at PTau time constant (typically 40), representing neuron-level purely spiking version of plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule. Used for specialized learning and computational functions, statistics, instead of Act.`, 17: `CaSpkD is continuous cascaded integration CaSpkP at DTau time constant (typically 40), representing neuron-level purely spiking version of minus, LTD direction of weight change and capturing the function of DAPK1 in the Kinase learning rule. Used for specialized learning and computational functions, statistics, instead of Act.`, 18: `CaSyn is spike-driven calcium trace for synapse-level Ca-driven learning: exponential integration of SpikeG * Spike at SynTau time constant (typically 30). Synapses integrate send.CaSyn * recv.CaSyn across M, P, D time integrals for the synaptic trace driving credit assignment in learning. Time constant reflects binding time of Glu to NMDA and Ca buffering postsynaptically, and determines time window where pre * post spiking must overlap to drive learning.`, 19: `CaSpkM is spike-driven calcium trace used as a neuron-level proxy for synpatic credit assignment factor based on continuous time-integrated spiking: exponential integration of SpikeG * Spike at MTau time constant (typically 5). Simulates a calmodulin (CaM) like signal at the most abstract level.`, 20: `CaSpkPM is minus-phase snapshot of the CaSpkP value -- similar to ActM but using a more directly spike-integrated value.`, 21: `CaLrn is recv neuron calcium signal used to drive temporal error difference component of standard learning rule, combining NMDA (NmdaCa) and spiking-driven VGCC (VgccCaInt) calcium sources (vs. CaSpk* which only reflects spiking component). This is integrated into CaM, CaP, CaD, and temporal derivative is CaP - CaD (CaMKII - DAPK1). This approximates the backprop error derivative on net input, but VGCC component adds a proportion of recv activation delta as well -- a balance of both works best. The synaptic-level trace multiplier provides the credit assignment factor, reflecting coincident activity and potentially integrated over longer multi-trial timescales.`, 22: `NrnCaM is integrated CaLrn at MTau timescale (typically 5), simulating a calmodulin (CaM) like signal, which then drives CaP, CaD for delta signal driving error-driven learning.`, 23: `NrnCaP is cascaded integration of CaM at PTau time constant (typically 40), representing the plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule.`, 24: `NrnCaD is cascaded integratoin of CaP at DTau time constant (typically 40), representing the minus, LTD direction of weight change and capturing the function of DAPK1 in the Kinase learning rule.`, 25: `CaDiff is difference between CaP - CaD -- this is the error signal that drives error-driven learning.`, 26: `RLRate is recv-unit based learning rate multiplier, reflecting the sigmoid derivative computed from the CaSpkD of recv unit, and the normalized difference CaSpkP - CaSpkD / MAX(CaSpkP - CaSpkD).`, 27: `SpkMaxCa is Ca integrated like CaSpkP but only starting at MaxCycStart cycle, to prevent inclusion of carryover spiking from prior theta cycle trial -- the PTau time constant otherwise results in significant carryover. This is the input to SpkMax`, 28: `SpkMax is maximum CaSpkP across one theta cycle time window (max of SpkMaxCa) -- used for specialized algorithms that have more phasic behavior within a single trial, e.g., BG Matrix layer gating. Also useful for visualization of peak activity of neurons.`, 29: `SpkPrv is final CaSpkD activation state at end of previous theta cycle. used for specialized learning mechanisms that operate on delayed sending activations.`, 30: `SpkSt1 is the activation state at specific time point within current state processing window (e.g., 50 msec for beta cycle within standard theta cycle), as saved by SpkSt1() function. Used for example in hippocampus for CA3, CA1 learning`, 31: `SpkSt2 is the activation state at specific time point within current state processing window (e.g., 100 msec for beta cycle within standard theta cycle), as saved by SpkSt2() function. Used for example in hippocampus for CA3, CA1 learning`, 32: `GeNoiseP is accumulating poisson probability factor for driving excitatory noise spiking -- multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda as function of noise firing rate.`, 33: `GeNoise is integrated noise excitatory conductance, added into Ge`, 34: `GiNoiseP is accumulating poisson probability factor for driving inhibitory noise spiking -- multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda as a function of noise firing rate.`, 35: `GiNoise is integrated noise inhibotyr conductance, added into Gi`, 36: `GeExt is extra excitatory conductance added to Ge -- from Ext input, GeCtxt etc`, 37: `GeRaw is raw excitatory conductance (net input) received from senders = current raw spiking drive`, 38: `GeSyn is time-integrated total excitatory synaptic conductance, with an instantaneous rise time from each spike (in GeRaw) and exponential decay with Dt.GeTau, aggregated over pathways -- does *not* include Gbar.E`, 39: `GiRaw is raw inhibitory conductance (net input) received from senders = current raw spiking drive`, 40: `GiSyn is time-integrated total inhibitory synaptic conductance, with an instantaneous rise time from each spike (in GiRaw) and exponential decay with Dt.GiTau, aggregated over pathways -- does *not* include Gbar.I. This is added with computed FFFB inhibition to get the full inhibition in Gi`, 41: `SMaintP is accumulating poisson probability factor for driving self-maintenance by simulating a population of mutually interconnected neurons. multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda based on accumulating self maint factor`, 42: `GeInt is integrated running-average activation value computed from Ge with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall Ge level across the ThetaCycle time scale (Ge itself fluctuates considerably) -- useful for stats to set strength of connections etc to get neurons into right range of overall excitatory drive`, 43: `GeIntNorm is normalized GeInt value (divided by the layer maximum) -- this is used for learning in layers that require learning on subthreshold activity`, 44: `GiInt is integrated running-average activation value computed from GiSyn with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall synaptic Gi level across the ThetaCycle time scale (Gi itself fluctuates considerably) -- useful for stats to set strength of connections etc to get neurons into right range of overall inhibitory drive`, 45: `GModRaw is raw modulatory conductance, received from GType = ModulatoryG pathways`, 46: `GModSyn is syn integrated modulatory conductance, received from GType = ModulatoryG pathways`, 47: `GMaintRaw is raw maintenance conductance, received from GType = MaintG pathways`, 48: `GMaintSyn is syn integrated maintenance conductance, integrated using MaintNMDA params.`, 49: `SSGi is SST+ somatostatin positive slow spiking inhibition`, 50: `SSGiDend is amount of SST+ somatostatin positive slow spiking inhibition applied to dendritic Vm (VmDend)`, 51: `Gak is conductance of A-type K potassium channels`, 52: `MahpN is accumulating voltage-gated gating value for the medium time scale AHP`, 53: `Gmahp is medium time scale AHP conductance`, 54: `SahpCa is slowly accumulating calcium value that drives the slow AHP`, 55: `SahpN is the sAHP gating value`, 56: `Gsahp is slow time scale AHP conductance`, 57: `GknaMed is conductance of sodium-gated potassium channel (KNa) medium dynamics (Slick), which produces accommodation / adaptation of firing`, 58: `GknaSlow is conductance of sodium-gated potassium channel (KNa) slow dynamics (Slack), which produces accommodation / adaptation of firing`, 59: `KirM is the Kir potassium (K) inwardly rectifying gating value`, 60: `Gkir is the conductance of the potassium (K) inwardly rectifying channel, which is strongest at low membrane potentials. Can be modulated by DA.`, 61: `GnmdaSyn is integrated NMDA recv synaptic current -- adds GeRaw and decays with time constant`, 62: `Gnmda is net postsynaptic (recv) NMDA conductance, after Mg V-gating and Gbar -- added directly to Ge as it has the same reversal potential`, 63: `GnmdaMaint is net postsynaptic maintenance NMDA conductance, computed from GMaintSyn and GMaintRaw, after Mg V-gating and Gbar -- added directly to Ge as it has the same reversal potential`, 64: `GnmdaLrn is learning version of integrated NMDA recv synaptic current -- adds GeRaw and decays with time constant -- drives NmdaCa that then drives CaM for learning`, 65: `NmdaCa is NMDA calcium computed from GnmdaLrn, drives learning via CaM`, 66: `GgabaB is net GABA-B conductance, after Vm gating and Gbar + Gbase -- applies to Gk, not Gi, for GIRK, with .1 reversal potential.`, 67: `GABAB is GABA-B / GIRK activation -- time-integrated value with rise and decay time constants`, 68: `GABABx is GABA-B / GIRK internal drive variable -- gets the raw activation and decays`, 69: `Gvgcc is conductance (via Ca) for VGCC voltage gated calcium channels`, 70: `VgccM is activation gate of VGCC channels`, 71: `VgccH inactivation gate of VGCC channels`, 72: `VgccCa is instantaneous VGCC calcium flux -- can be driven by spiking or directly from Gvgcc`, 73: `VgccCaInt time-integrated VGCC calcium flux -- this is actually what drives learning`, 74: `SKCaIn is intracellular calcium store level, available to be released with spiking as SKCaR, which can bind to SKCa receptors and drive K current. replenishment is a function of spiking activity being below a threshold`, 75: `SKCaR released amount of intracellular calcium, from SKCaIn, as a function of spiking events. this can bind to SKCa channels and drive K currents.`, 76: `SKCaM is Calcium-gated potassium channel gating factor, driven by SKCaR via a Hill equation as in chans.SKPCaParams.`, 77: `Gsk is Calcium-gated potassium channel conductance as a function of Gbar * SKCaM.`, 78: `Burst is 5IB bursting activation value, computed by thresholding regular CaSpkP value in Super superficial layers`, 79: `BurstPrv is previous Burst bursting activation from prior time step -- used for context-based learning`, 80: `CtxtGe is context (temporally delayed) excitatory conductance, driven by deep bursting at end of the plus phase, for CT layers.`, 81: `CtxtGeRaw is raw update of context (temporally delayed) excitatory conductance, driven by deep bursting at end of the plus phase, for CT layers.`, 82: `CtxtGeOrig is original CtxtGe value prior to any decay factor -- updates at end of plus phase.`, 83: `NrnFlags are bit flags for binary state variables, which are converted to / from uint32. These need to be in Vars because they can be differential per data (for ext inputs) and are writable (indexes are read only).`} +var _NeuronVarsDescMap = map[NeuronVars]string{0: `Spike is whether neuron has spiked or not on this cycle (0 or 1)`, 1: `Spiked is 1 if neuron has spiked within the last 10 cycles (msecs), corresponding to a nominal max spiking rate of 100 Hz, 0 otherwise -- useful for visualization and computing activity levels in terms of average spiked levels.`, 2: `Act is rate-coded activation value reflecting instantaneous estimated rate of spiking, based on 1 / ISIAvg. This drives feedback inhibition in the FFFB function (todo: this will change when better inhibition is implemented), and is integrated over time for ActInt which is then used for performance statistics and layer average activations, etc. Should not be used for learning or other computations.`, 3: `ActInt is integrated running-average activation value computed from Act with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall activation state across the ThetaCycle time scale, as the overall response of network to current input state -- this is copied to ActM and ActP at the ends of the minus and plus phases, respectively, and used in computing performance-level statistics (which are typically based on ActM). Should not be used for learning or other computations.`, 4: `ActM is ActInt activation state at end of third quarter, representing the posterior-cortical minus phase activation -- used for statistics and monitoring network performance. Should not be used for learning or other computations.`, 5: `ActP is ActInt activation state at end of fourth quarter, representing the posterior-cortical plus_phase activation -- used for statistics and monitoring network performance. Should not be used for learning or other computations.`, 6: `Ext is external input: drives activation of unit from outside influences (e.g., sensory input)`, 7: `Target is the target value: drives learning to produce this activation value`, 8: `Ge is total excitatory conductance, including all forms of excitation (e.g., NMDA) -- does *not* include Gbar.E`, 9: `Gi is total inhibitory synaptic conductance -- the net inhibitory input to the neuron -- does *not* include Gbar.I`, 10: `Gk is total potassium conductance, typically reflecting sodium-gated potassium currents involved in adaptation effects -- does *not* include Gbar.K`, 11: `Inet is net current produced by all channels -- drives update of Vm`, 12: `Vm is membrane potential -- integrates Inet current over time`, 13: `VmDend is dendritic membrane potential -- has a slower time constant, is not subject to the VmR reset after spiking`, 14: `ISI is current inter-spike-interval -- counts up since last spike. Starts at -1 when initialized.`, 15: `ISIAvg is average inter-spike-interval -- average time interval between spikes, integrated with ISITau rate constant (relatively fast) to capture something close to an instantaneous spiking rate. Starts at -1 when initialized, and goes to -2 after first spike, and is only valid after the second spike post-initialization.`, 16: `CaSpkM is spike-driven calcium trace used as a neuron-level proxy for synpatic credit assignment factor based on continuous time-integrated spiking: exponential integration of SpikeG * Spike at MTau time constant (typically 5). Simulates a calmodulin (CaM) like signal at the most abstract level.`, 17: `CaSpkP is continuous cascaded integration of CaSpkM at PTau time constant (typically 40), representing neuron-level purely spiking version of plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule. Used for specialized learning and computational functions, statistics, instead of Act.`, 18: `CaSpkD is continuous cascaded integration CaSpkP at DTau time constant (typically 40), representing neuron-level purely spiking version of minus, LTD direction of weight change and capturing the function of DAPK1 in the Kinase learning rule. Used for specialized learning and computational functions, statistics, instead of Act.`, 19: `CaSyn is spike-driven calcium trace for synapse-level Ca-driven learning: exponential integration of SpikeG * Spike at SynTau time constant (typically 30). Synapses integrate send.CaSyn * recv.CaSyn across M, P, D time integrals for the synaptic trace driving credit assignment in learning. Time constant reflects binding time of Glu to NMDA and Ca buffering postsynaptically, and determines time window where pre * post spiking must overlap to drive learning.`, 20: `CaSpkPM is minus-phase snapshot of the CaSpkP value -- similar to ActM but using a more directly spike-integrated value.`, 21: `CaLrn is recv neuron calcium signal used to drive temporal error difference component of standard learning rule, combining NMDA (NmdaCa) and spiking-driven VGCC (VgccCaInt) calcium sources (vs. CaSpk* which only reflects spiking component). This is integrated into CaM, CaP, CaD, and temporal derivative is CaP - CaD (CaMKII - DAPK1). This approximates the backprop error derivative on net input, but VGCC component adds a proportion of recv activation delta as well -- a balance of both works best. The synaptic-level trace multiplier provides the credit assignment factor, reflecting coincident activity and potentially integrated over longer multi-trial timescales.`, 22: `NrnCaM is integrated CaLrn at MTau timescale (typically 5), simulating a calmodulin (CaM) like signal, which then drives CaP, CaD for delta signal driving error-driven learning.`, 23: `NrnCaP is cascaded integration of CaM at PTau time constant (typically 40), representing the plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule.`, 24: `NrnCaD is cascaded integratoin of CaP at DTau time constant (typically 40), representing the minus, LTD direction of weight change and capturing the function of DAPK1 in the Kinase learning rule.`, 25: `CaDiff is difference between CaP - CaD -- this is the error signal that drives error-driven learning.`, 26: `RLRate is recv-unit based learning rate multiplier, reflecting the sigmoid derivative computed from the CaSpkD of recv unit, and the normalized difference CaSpkP - CaSpkD / MAX(CaSpkP - CaSpkD).`, 27: `SpkMaxCa is Ca integrated like CaSpkP but only starting at MaxCycStart cycle, to prevent inclusion of carryover spiking from prior theta cycle trial -- the PTau time constant otherwise results in significant carryover. This is the input to SpkMax`, 28: ``, 29: ``, 30: ``, 31: ``, 32: `SpkMax is maximum CaSpkP across one theta cycle time window (max of SpkMaxCa) -- used for specialized algorithms that have more phasic behavior within a single trial, e.g., BG Matrix layer gating. Also useful for visualization of peak activity of neurons.`, 33: `SpkPrv is final CaSpkD activation state at end of previous theta cycle. used for specialized learning mechanisms that operate on delayed sending activations.`, 34: `SpkSt1 is the activation state at specific time point within current state processing window (e.g., 50 msec for beta cycle within standard theta cycle), as saved by SpkSt1() function. Used for example in hippocampus for CA3, CA1 learning`, 35: `SpkSt2 is the activation state at specific time point within current state processing window (e.g., 100 msec for beta cycle within standard theta cycle), as saved by SpkSt2() function. Used for example in hippocampus for CA3, CA1 learning`, 36: `GeNoiseP is accumulating poisson probability factor for driving excitatory noise spiking -- multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda as function of noise firing rate.`, 37: `GeNoise is integrated noise excitatory conductance, added into Ge`, 38: `GiNoiseP is accumulating poisson probability factor for driving inhibitory noise spiking -- multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda as a function of noise firing rate.`, 39: `GiNoise is integrated noise inhibotyr conductance, added into Gi`, 40: `GeExt is extra excitatory conductance added to Ge -- from Ext input, GeCtxt etc`, 41: `GeRaw is raw excitatory conductance (net input) received from senders = current raw spiking drive`, 42: `GeSyn is time-integrated total excitatory synaptic conductance, with an instantaneous rise time from each spike (in GeRaw) and exponential decay with Dt.GeTau, aggregated over pathways -- does *not* include Gbar.E`, 43: `GiRaw is raw inhibitory conductance (net input) received from senders = current raw spiking drive`, 44: `GiSyn is time-integrated total inhibitory synaptic conductance, with an instantaneous rise time from each spike (in GiRaw) and exponential decay with Dt.GiTau, aggregated over pathways -- does *not* include Gbar.I. This is added with computed FFFB inhibition to get the full inhibition in Gi`, 45: `SMaintP is accumulating poisson probability factor for driving self-maintenance by simulating a population of mutually interconnected neurons. multiply times uniform random deviate at each time step, until it gets below the target threshold based on poisson lambda based on accumulating self maint factor`, 46: `GeInt is integrated running-average activation value computed from Ge with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall Ge level across the ThetaCycle time scale (Ge itself fluctuates considerably) -- useful for stats to set strength of connections etc to get neurons into right range of overall excitatory drive`, 47: `GeIntNorm is normalized GeInt value (divided by the layer maximum) -- this is used for learning in layers that require learning on subthreshold activity`, 48: `GiInt is integrated running-average activation value computed from GiSyn with time constant Act.Dt.IntTau, to produce a longer-term integrated value reflecting the overall synaptic Gi level across the ThetaCycle time scale (Gi itself fluctuates considerably) -- useful for stats to set strength of connections etc to get neurons into right range of overall inhibitory drive`, 49: `GModRaw is raw modulatory conductance, received from GType = ModulatoryG pathways`, 50: `GModSyn is syn integrated modulatory conductance, received from GType = ModulatoryG pathways`, 51: `GMaintRaw is raw maintenance conductance, received from GType = MaintG pathways`, 52: `GMaintSyn is syn integrated maintenance conductance, integrated using MaintNMDA params.`, 53: `SSGi is SST+ somatostatin positive slow spiking inhibition`, 54: `SSGiDend is amount of SST+ somatostatin positive slow spiking inhibition applied to dendritic Vm (VmDend)`, 55: `Gak is conductance of A-type K potassium channels`, 56: `MahpN is accumulating voltage-gated gating value for the medium time scale AHP`, 57: `Gmahp is medium time scale AHP conductance`, 58: `SahpCa is slowly accumulating calcium value that drives the slow AHP`, 59: `SahpN is the sAHP gating value`, 60: `Gsahp is slow time scale AHP conductance`, 61: `GknaMed is conductance of sodium-gated potassium channel (KNa) medium dynamics (Slick), which produces accommodation / adaptation of firing`, 62: `GknaSlow is conductance of sodium-gated potassium channel (KNa) slow dynamics (Slack), which produces accommodation / adaptation of firing`, 63: `KirM is the Kir potassium (K) inwardly rectifying gating value`, 64: `Gkir is the conductance of the potassium (K) inwardly rectifying channel, which is strongest at low membrane potentials. Can be modulated by DA.`, 65: `GnmdaSyn is integrated NMDA recv synaptic current -- adds GeRaw and decays with time constant`, 66: `Gnmda is net postsynaptic (recv) NMDA conductance, after Mg V-gating and Gbar -- added directly to Ge as it has the same reversal potential`, 67: `GnmdaMaint is net postsynaptic maintenance NMDA conductance, computed from GMaintSyn and GMaintRaw, after Mg V-gating and Gbar -- added directly to Ge as it has the same reversal potential`, 68: `GnmdaLrn is learning version of integrated NMDA recv synaptic current -- adds GeRaw and decays with time constant -- drives NmdaCa that then drives CaM for learning`, 69: `NmdaCa is NMDA calcium computed from GnmdaLrn, drives learning via CaM`, 70: `GgabaB is net GABA-B conductance, after Vm gating and Gbar + Gbase -- applies to Gk, not Gi, for GIRK, with .1 reversal potential.`, 71: `GABAB is GABA-B / GIRK activation -- time-integrated value with rise and decay time constants`, 72: `GABABx is GABA-B / GIRK internal drive variable -- gets the raw activation and decays`, 73: `Gvgcc is conductance (via Ca) for VGCC voltage gated calcium channels`, 74: `VgccM is activation gate of VGCC channels`, 75: `VgccH inactivation gate of VGCC channels`, 76: `VgccCa is instantaneous VGCC calcium flux -- can be driven by spiking or directly from Gvgcc`, 77: `VgccCaInt time-integrated VGCC calcium flux -- this is actually what drives learning`, 78: `SKCaIn is intracellular calcium store level, available to be released with spiking as SKCaR, which can bind to SKCa receptors and drive K current. replenishment is a function of spiking activity being below a threshold`, 79: `SKCaR released amount of intracellular calcium, from SKCaIn, as a function of spiking events. this can bind to SKCa channels and drive K currents.`, 80: `SKCaM is Calcium-gated potassium channel gating factor, driven by SKCaR via a Hill equation as in chans.SKPCaParams.`, 81: `Gsk is Calcium-gated potassium channel conductance as a function of Gbar * SKCaM.`, 82: `Burst is 5IB bursting activation value, computed by thresholding regular CaSpkP value in Super superficial layers`, 83: `BurstPrv is previous Burst bursting activation from prior time step -- used for context-based learning`, 84: `CtxtGe is context (temporally delayed) excitatory conductance, driven by deep bursting at end of the plus phase, for CT layers.`, 85: `CtxtGeRaw is raw update of context (temporally delayed) excitatory conductance, driven by deep bursting at end of the plus phase, for CT layers.`, 86: `CtxtGeOrig is original CtxtGe value prior to any decay factor -- updates at end of plus phase.`, 87: `NrnFlags are bit flags for binary state variables, which are converted to / from uint32. These need to be in Vars because they can be differential per data (for ext inputs) and are writable (indexes are read only).`} -var _NeuronVarsMap = map[NeuronVars]string{0: `Spike`, 1: `Spiked`, 2: `Act`, 3: `ActInt`, 4: `ActM`, 5: `ActP`, 6: `Ext`, 7: `Target`, 8: `Ge`, 9: `Gi`, 10: `Gk`, 11: `Inet`, 12: `Vm`, 13: `VmDend`, 14: `ISI`, 15: `ISIAvg`, 16: `CaSpkP`, 17: `CaSpkD`, 18: `CaSyn`, 19: `CaSpkM`, 20: `CaSpkPM`, 21: `CaLrn`, 22: `NrnCaM`, 23: `NrnCaP`, 24: `NrnCaD`, 25: `CaDiff`, 26: `RLRate`, 27: `SpkMaxCa`, 28: `SpkMax`, 29: `SpkPrv`, 30: `SpkSt1`, 31: `SpkSt2`, 32: `GeNoiseP`, 33: `GeNoise`, 34: `GiNoiseP`, 35: `GiNoise`, 36: `GeExt`, 37: `GeRaw`, 38: `GeSyn`, 39: `GiRaw`, 40: `GiSyn`, 41: `SMaintP`, 42: `GeInt`, 43: `GeIntNorm`, 44: `GiInt`, 45: `GModRaw`, 46: `GModSyn`, 47: `GMaintRaw`, 48: `GMaintSyn`, 49: `SSGi`, 50: `SSGiDend`, 51: `Gak`, 52: `MahpN`, 53: `Gmahp`, 54: `SahpCa`, 55: `SahpN`, 56: `Gsahp`, 57: `GknaMed`, 58: `GknaSlow`, 59: `KirM`, 60: `Gkir`, 61: `GnmdaSyn`, 62: `Gnmda`, 63: `GnmdaMaint`, 64: `GnmdaLrn`, 65: `NmdaCa`, 66: `GgabaB`, 67: `GABAB`, 68: `GABABx`, 69: `Gvgcc`, 70: `VgccM`, 71: `VgccH`, 72: `VgccCa`, 73: `VgccCaInt`, 74: `SKCaIn`, 75: `SKCaR`, 76: `SKCaM`, 77: `Gsk`, 78: `Burst`, 79: `BurstPrv`, 80: `CtxtGe`, 81: `CtxtGeRaw`, 82: `CtxtGeOrig`, 83: `NrnFlags`} +var _NeuronVarsMap = map[NeuronVars]string{0: `Spike`, 1: `Spiked`, 2: `Act`, 3: `ActInt`, 4: `ActM`, 5: `ActP`, 6: `Ext`, 7: `Target`, 8: `Ge`, 9: `Gi`, 10: `Gk`, 11: `Inet`, 12: `Vm`, 13: `VmDend`, 14: `ISI`, 15: `ISIAvg`, 16: `CaSpkM`, 17: `CaSpkP`, 18: `CaSpkD`, 19: `CaSyn`, 20: `CaSpkPM`, 21: `CaLrn`, 22: `NrnCaM`, 23: `NrnCaP`, 24: `NrnCaD`, 25: `CaDiff`, 26: `RLRate`, 27: `SpkMaxCa`, 28: `SpkBin0`, 29: `SpkBin1`, 30: `SpkBin2`, 31: `SpkBin3`, 32: `SpkMax`, 33: `SpkPrv`, 34: `SpkSt1`, 35: `SpkSt2`, 36: `GeNoiseP`, 37: `GeNoise`, 38: `GiNoiseP`, 39: `GiNoise`, 40: `GeExt`, 41: `GeRaw`, 42: `GeSyn`, 43: `GiRaw`, 44: `GiSyn`, 45: `SMaintP`, 46: `GeInt`, 47: `GeIntNorm`, 48: `GiInt`, 49: `GModRaw`, 50: `GModSyn`, 51: `GMaintRaw`, 52: `GMaintSyn`, 53: `SSGi`, 54: `SSGiDend`, 55: `Gak`, 56: `MahpN`, 57: `Gmahp`, 58: `SahpCa`, 59: `SahpN`, 60: `Gsahp`, 61: `GknaMed`, 62: `GknaSlow`, 63: `KirM`, 64: `Gkir`, 65: `GnmdaSyn`, 66: `Gnmda`, 67: `GnmdaMaint`, 68: `GnmdaLrn`, 69: `NmdaCa`, 70: `GgabaB`, 71: `GABAB`, 72: `GABABx`, 73: `Gvgcc`, 74: `VgccM`, 75: `VgccH`, 76: `VgccCa`, 77: `VgccCaInt`, 78: `SKCaIn`, 79: `SKCaR`, 80: `SKCaM`, 81: `Gsk`, 82: `Burst`, 83: `BurstPrv`, 84: `CtxtGe`, 85: `CtxtGeRaw`, 86: `CtxtGeOrig`, 87: `NrnFlags`} // String returns the string representation of this NeuronVars value. func (i NeuronVars) String() string { return enums.String(i, _NeuronVarsMap) } diff --git a/axon/gpu_hlsl/gpu_synca.hlsl b/axon/gpu_hlsl/gpu_synca.hlsl index 35e7b3985..60eebb989 100644 --- a/axon/gpu_hlsl/gpu_synca.hlsl +++ b/axon/gpu_hlsl/gpu_synca.hlsl @@ -62,7 +62,7 @@ void SynCaSendPath(in Context ctx, in PathParams pj, in LayerParams ly, uint ni, return; } - float snCaSyn = pj.Learn.KinaseCa.SpikeG * NrnV(ctx, ni, di, CaSyn); + float snCaSyn = pj.Learn.KinaseCa.CaScale * NrnV(ctx, ni, di, CaSyn); uint cni = pj.Indexes.SendConSt + lni; uint synst = pj.Indexes.SynapseSt + SendCon[cni].Start; uint synn = SendCon[cni].N; @@ -80,7 +80,7 @@ void SynCaRecvPath(in Context ctx, in PathParams pj, in LayerParams ly, uint ni, return; } - float rnCaSyn = pj.Learn.KinaseCa.SpikeG * NrnV(ctx, ni, di, CaSyn); + float rnCaSyn = pj.Learn.KinaseCa.CaScale * NrnV(ctx, ni, di, CaSyn); uint cni = pj.Indexes.RecvConSt + lni; uint synst = pj.Indexes.RecvSynSt + RecvCon[cni].Start; uint synn = RecvCon[cni].N; diff --git a/axon/layerparams.go b/axon/layerparams.go index 1ba38ec73..cb6c5a6e3 100644 --- a/axon/layerparams.go +++ b/axon/layerparams.go @@ -715,6 +715,18 @@ func (ly *LayerParams) SpikeFromG(ctx *Context, ni, di uint32, lpl *Pool) { SetNrnV(ctx, ni, di, SpkMax, spkmax) } } + bin := ctx.Cycle / 50 + spk := NrnV(ctx, ni, di, Spike) + switch bin { + case 0: + AddNrnV(ctx, ni, di, SpkBin0, spk) + case 1: + AddNrnV(ctx, ni, di, SpkBin1, spk) + case 2: + AddNrnV(ctx, ni, di, SpkBin2, spk) + case 3: + AddNrnV(ctx, ni, di, SpkBin3, spk) + } } // PostSpikeSpecial does updates at neuron level after spiking has been computed. @@ -973,6 +985,11 @@ func (ly *LayerParams) NewStateNeuron(ctx *Context, ni, di uint32, vals *LayerVa SetNrnV(ctx, ni, di, SpkMax, 0) SetNrnV(ctx, ni, di, SpkMaxCa, 0) + SetNrnV(ctx, ni, di, SpkBin0, 0) + SetNrnV(ctx, ni, di, SpkBin1, 0) + SetNrnV(ctx, ni, di, SpkBin2, 0) + SetNrnV(ctx, ni, di, SpkBin3, 0) + ly.Acts.DecayState(ctx, ni, di, ly.Acts.Decay.Act, ly.Acts.Decay.Glong, ly.Acts.Decay.AHP) // Note: synapse-level Ca decay happens in DWt ly.Acts.KNaNewState(ctx, ni, di) diff --git a/axon/neuron.go b/axon/neuron.go index d73db4d35..73e40067c 100644 --- a/axon/neuron.go +++ b/axon/neuron.go @@ -94,6 +94,9 @@ const ( ///////////////////////////////////////// // Calcium for learning + // CaSpkM is spike-driven calcium trace used as a neuron-level proxy for synpatic credit assignment factor based on continuous time-integrated spiking: exponential integration of SpikeG * Spike at MTau time constant (typically 5). Simulates a calmodulin (CaM) like signal at the most abstract level. + CaSpkM + // CaSpkP is continuous cascaded integration of CaSpkM at PTau time constant (typically 40), representing neuron-level purely spiking version of plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule. Used for specialized learning and computational functions, statistics, instead of Act. CaSpkP @@ -103,9 +106,6 @@ const ( // CaSyn is spike-driven calcium trace for synapse-level Ca-driven learning: exponential integration of SpikeG * Spike at SynTau time constant (typically 30). Synapses integrate send.CaSyn * recv.CaSyn across M, P, D time integrals for the synaptic trace driving credit assignment in learning. Time constant reflects binding time of Glu to NMDA and Ca buffering postsynaptically, and determines time window where pre * post spiking must overlap to drive learning. CaSyn - // CaSpkM is spike-driven calcium trace used as a neuron-level proxy for synpatic credit assignment factor based on continuous time-integrated spiking: exponential integration of SpikeG * Spike at MTau time constant (typically 5). Simulates a calmodulin (CaM) like signal at the most abstract level. - CaSpkM - // CaSpkPM is minus-phase snapshot of the CaSpkP value -- similar to ActM but using a more directly spike-integrated value. CaSpkPM @@ -133,6 +133,11 @@ const ( // SpkMaxCa is Ca integrated like CaSpkP but only starting at MaxCycStart cycle, to prevent inclusion of carryover spiking from prior theta cycle trial -- the PTau time constant otherwise results in significant carryover. This is the input to SpkMax SpkMaxCa + SpkBin0 + SpkBin1 + SpkBin2 + SpkBin3 + // SpkMax is maximum CaSpkP across one theta cycle time window (max of SpkMaxCa) -- used for specialized algorithms that have more phasic behavior within a single trial, e.g., BG Matrix layer gating. Also useful for visualization of peak activity of neurons. SpkMax diff --git a/axon/pathparams.go b/axon/pathparams.go index aae9d0dfa..c1d44483b 100644 --- a/axon/pathparams.go +++ b/axon/pathparams.go @@ -344,8 +344,28 @@ func (pj *PathParams) DWtSynCortex(ctx *Context, syni, si, ri, di uint32, layPoo syCaP := SynCaV(ctx, syni, di, CaP) // slower but still fast time scale, drives Potentiation syCaD := SynCaV(ctx, syni, di, CaD) // slow time scale, drives Depression (one trial = 200 cycles) pj.Learn.KinaseCa.CurCa(ctx.SynCaCtr, caUpT, &syCaM, &syCaP, &syCaD) // always update, getting current Ca (just optimization) - dtr := syCaD // delta trace, caD reflects entire window - if pj.PathType == CTCtxtPath { // layer 6 CT pathway + + rb0 := NrnV(ctx, ri, di, SpkBin0) + sb0 := NrnV(ctx, si, di, SpkBin0) + rb1 := NrnV(ctx, ri, di, SpkBin1) + sb1 := NrnV(ctx, si, di, SpkBin1) + rb2 := NrnV(ctx, ri, di, SpkBin2) + sb2 := NrnV(ctx, si, di, SpkBin2) + rb3 := NrnV(ctx, ri, di, SpkBin3) + sb3 := NrnV(ctx, si, di, SpkBin3) + + b0 := 0.1 * (rb0 * sb0) + b1 := 0.1 * (rb1 * sb1) + b2 := 0.1 * (rb2 * sb2) + b3 := 0.1 * (rb3 * sb3) + + pj.Learn.KinaseCa.FinalCa(b0, b1, b2, b3, &syCaM, &syCaP, &syCaD) + + SetSynCaV(ctx, syni, di, CaM, syCaM) + SetSynCaV(ctx, syni, di, CaP, syCaP) + SetSynCaV(ctx, syni, di, CaD, syCaD) + dtr := syCaD // delta trace, caD reflects entire window + if pj.PathType == CTCtxtPath { // layer 6 CT pathway dtr = NrnV(ctx, si, di, BurstPrv) } SetSynCaV(ctx, syni, di, DTr, dtr) // save delta trace for GUI diff --git a/axon/rand.go b/axon/rand.go index 9c239b6e1..53d0a6367 100644 --- a/axon/rand.go +++ b/axon/rand.go @@ -2,6 +2,7 @@ package axon import ( "cogentcore.org/core/vgpu/gosl/slrand" + "cogentcore.org/core/vgpu/gosl/sltype" ) //gosl:hlsl axonrand @@ -31,7 +32,8 @@ func GetRandomNumber(index uint32, counter slrand.Counter, funIndex RandFunIndex var randCtr slrand.Counter randCtr = counter randCtr.Add(uint32(funIndex)) - ctr := randCtr.Uint2() + var ctr sltype.Uint2 + ctr = randCtr.Uint2() return slrand.Float(&ctr, index) } diff --git a/axon/shaders/gpu_applyext.spv b/axon/shaders/gpu_applyext.spv index fc1419f1959e7290f01561df49e26c1f981fa386..7ef86adf17b8d04d032a49151c8875ec01b20456 100644 GIT binary patch delta 43 ycmca{jPcGf#to0eMcEkC7#JA*QcH`R69W>95_5}z+|8fGzdA66Z+;n(&jkQhrw@hz delta 39 vcmca}jPb@X#to0e1z8!?7#J9w6N3w~0}_i8bBi~B7ys(O7`*vyL_QY)DM=3* diff --git a/axon/shaders/gpu_betweengi.spv b/axon/shaders/gpu_betweengi.spv index 7a226b1edb1cc85f5594703b93750afb4cc052c9..e2636ab652df12d0907d8798e8fd3bf342e4536c 100644 GIT binary patch delta 36 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 P$i-ed{>=_to%{a*x*yB> literal 105844 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 diff --git a/axon/shaders/gpu_cyclepost.spv b/axon/shaders/gpu_cyclepost.spv index 234e0957ef97514dbfba80da696bd73b13b185bc..53dede56f59398d5bb45c5c995a1c49082d9c8fb 100644 GIT binary patch delta 40 ucmcc7&2gujW5XeFQ8oru1_lPd)Y2m7#DK)2#N1*axB0U8_RHdotnUC3%ne8Y delta 36 scmcc9&2gifW5XeFK~@G;1_lP_#NdMLfW)H2+~Vfz;@hu_GqSz|0O#fm-v9sr diff --git a/axon/shaders/gpu_dwt.spv b/axon/shaders/gpu_dwt.spv index a3fede8e46c98a9ba0bfa5a7b80cfc24c5fc2b2e..abf2004abf4f73591fe1415fde51810b328b7ebe 100644 GIT binary patch literal 94300 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%0DUUiKF)~aPG!Z@89tH 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%0DvX=O(YdobtaN^7D{aUrzZ) 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 literal 94492 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 diff --git a/axon/shaders/gpu_dwtfmdi.spv b/axon/shaders/gpu_dwtfmdi.spv index 4ac7fb67363d2e000663a312b8835e7299659c04..614a45e87bd27f66c1f372687d893d865065c854 100644 GIT binary patch delta 837 zcmY+?%SyvQ7>41A*qC^ztrY?)Rd5k;RS!E|6cez5!AM=WaN%eL!7A|t3PQXDG2l|V z6L*oUybCYEI}q={`DPsbr*sHBo%}Fw=kug@o;Td-_U&1~V}8L;FPY6sY>KH*z}tts zdz5Xt8>#k^_$lDg0d{D!rNxE~NDB>fgeAPQEFORFx^iFCpf;#%fmq6h6fP2E!^)PZ zjYx})fn{ZMARAR?%&RCf=2fLNLu25W#LyU6Q)UbtS0)A)Pwsp*MOhS_6{{&$>$f%v z!a`yw2x}2TLD(iS6okdZP!P65Oax3N?h-^nY}_M;g0OvJC4Y zVJrV9MnT|}Sh@lV!fuG6AnY!CpZK!!;&t++&q}iGdM&!Q)TO(Q2lT3B-@f-a=g@C9a*m@hFfH4vl*!)*>F&_YVxEmz^ diff --git a/axon/shaders/gpu_dwtsubmean.spv b/axon/shaders/gpu_dwtsubmean.spv index 9faadd3f31ec7018bce8097b17da4624293f9e24..b11cb97689f15a6690779c0aba4776a9e6cca8ec 100644 GIT binary patch delta 826 zcmY+=KTE?v7{~F8+W5D&HcE9;5U~zIt1b>=p#keq2~<>yh*w+CQYBUe1tGozEB6M( z#kG*P;OO9@lkY(%NAZ4lraTu2A)hCC;J&ZlR{O{5{H7;tHqRK_s$aDV+~X~NdLduK z#3WBnmv7FxX0sS8$O*0jFCXz{UEF6jgUDmbOI6Gxvz2*<^(%7?8<6Jn+KPO1{~c7{ zm9o@^wB?8eY*^zGK{ldonOa<#XDl4mMi;V#He+8>o3U?9S>81krWCryLPwjia9o>Q z7=C1)7S~V~1!v`*mv`~MHVVRAVkihJMkcJH6JP_HVd6y-`9w3=HZdfF?GZyV*gi2N zgB=n>GFXk6Ox93%Oc2fRVUrk|!F*y!2D>DNWUy;uNCvwV=R03kC*-@&Jqy02Tdm4L zbkaLw(Mj7PS8?VZ$s{^kN7@GKV+V2rYQKdimG^{|7VC{E@lwxSC*jEgkykhifYKg7rLG{6O;J5eq6Ul*5lf&97Z580 zvBTtrF~XJsNHRQ7nFJ&;UZ_|BP|Tfyg&_{eX9MC1o8QJ<7kDRMgbWiKNs71Jtwu6Vq;{BBEVIxp!%|ydlc8 zL`B7+G>6I|O4G8$%sJD{G|Q3(GiNR5to#4(y`STEyq@3rSkL=B@AppY+iNf2%v(C| zxV^J`Q0GQN8;y=eqcNiK$!ohi)?I6r##pR<4*Sxq-KS5UK5P0>$6_w;TX*^zef!Ry z(a){Y7}A)4;?M5W_x;@TBM+-D9J^N)en^v_bclMmRhr!70UX)cKVbkj3~uK1L$~G9 zzjxK9-=wWdZg`6uS8!EhwHCQ`K{mQt+%_fG-Q*?@2som}l>r;8x3~fE)@X49;*D%_ zyGP|u{3IncW8h@9pY7F?RU zsNg&ghPwuCkH+A}VPFsJeao*sXuUNDt>gTU>Zu=_HMpKIW2buZ5yO^0F>CCQDVyN4 z8UFS#zlqwB zT(A?1eI9s&!ag6oMPV-kZ&i<+z2zilnq3!z2N(9&!Okf9H^9y(_9fs!g?(wgY{b5*DF}BHaeTvDcmI|cO}a`{*31^pT_lD^^_BP>J3ip z+W6aAtW(?G-vPTrKHgX1-B(==a~10vJm)sAjfURxms6YEwQb(oz6yfWxrK}%--6Ef|ZUD<$){R{K zu`Kx?vg9m7T$Uw2o@c^5u0LWO!1^M~QD4ZS z8T@wtS#a@R0oEt}w}4yz^^GU3J@TiRQju@1SDw^2@@Fu&7VK^H$T@u@Z-=?9VDG5M z&*`h~gt>$DmG;o@0(*1yKDo`^4VKq;JRjiGxZcC^Y3fweQ}EBhYU3NLHcsbyFKY*u zerkR!Tz(vyQ=AR>1xv?lx)1zLoBYg}$UXP7^h@i%1ebd*!Y(KI0Jc8y{}p%#p1u8* zT?BD9E1f(D)+rl)4Sst9KeX|G2&_;1AASe_y72!E_+j$*Z+PS#HY_PN{1&Xwm)p1H zcVKUoiF5lNZF8QpaK8ti!SXESmi_^(Z>1RWF|dN4BJZ>JZzXFe%lr2jYZpFAawoEq z;E&+>tTMr$uuY(r_H|)e$ zH@;jee${$ZJ_)gqRVH`}+XQM!@HAMyOz;eL5~!O%u5930>_x0H{&U!mdjA!Z;CZk@ zncxNNBv3bjT$$iS?8U4y!QZiMKrQkA0hUkv%6t40D+zQkfn1s3Wo!?dPn_KMSHPZV zpEpVHDp+5&oT1mi!&sgn^?Zb1_uWS^0p9?h$tt_}C$?RvCCQs$`E+3u|6-*Hb(@eQ zNq_u*gO{-0D%kmVv?^9i#T{^|SUnYYg4I&+An;l2Tfs_kgW)V#E!+^Wd|B`+*h9_l zSah&rNt5_xG?c4fPF`Q4x0(1210TcnM%Jp};jDZCt_D{3Iq`C1aHFfOV>Z9^)Vo>o z#uZnoa0G@=Bm?9bzdCp#oCT`qNw)@AEl;|U;Jw>^Y8QhqVa0zGoIdgI0k{3DMmAhp zY*-Tqow8xAw>I?qx4%G|Q&}5bAN}VMXPvkCdq|y{1s%?HU37iMH>%ca(R%N&!A2;gn#1>eLquPX1tmecPl9?x^p#(?GJeE(RVt3SSfsP(bdulU1zp^@kM2H-Bwtc*Z`nx}e^4(x{$DZ4}5m?^ujQG6=yHa=nGL9Q#D|k}Fy%*bCqUPCf z#P0(i%+<4@p3#m4s~t_3v(YvI%Xzrv^-lqtcJTSPqOyR^a6%YRz~#&z)d>jZ3#HHhmrTnBUAma8Mzv5P}x;17WL zZT@A$t}XzZtZFCT4(y9e{I|#Ex9P8@uQ5{S4&ar3{ zox)+WxDR2=nKVy6InR$>+srtw$+Z)h-$u1Hf4oySJEPu@mJPeKH|VcsHwH;TyMq1N zj{k1h{0?YFAB)pZoxNK(s~?ZylP}$T7%XQ}H>k-qyQvqQ+EeY0#qWUd<;|FYSl*0} z6#i=Z8YAU@6zp3;%HIQ<-vROUu^RlUh7Q@hC)jWNl)o3YoJrlFCRg4JPg;_F49xF< zWMwmZBbLof^w?&DqRs|ML6g9~Atb>**!&JippV7rr(PE4@lULegI_9QO~y9=fM7Zq zOh+BcU>?7h_$MEa=@hWV`Y7|L`uXxEdo-PvpTmhPr=y>R7}pQ9dyPAsYvp+s#r z!Ct{iA)kdafm*nO!SZF&>DWoCo*ajO)y5y({-XUH#z6#hRCakR*W+0;7}?=m4~4VP zCkdy07}!1DCclu?^QHZHaDS}&n6rDT|0o&o5$wp#_yV@Ne@j0N{_wZ?T2Xwzh^C$| z*dxI1m-idp%8mrf=X>j@4w{hsTKfq*1MG|u_}7@$Q}<}F{7D2z%QLa%)ABK3TT9F8 zX?Yg7X!)F;>R1@tO6kXe%hJDut&e<4|4*=dNF?vvFYEeQxix)1WLnDdvIYOq~>`W6M9={%D*5HdIomC&helf7|u7^LwiW zFy|6&1uKJH2?*-k}5;%P_?6bgf z8TQ#=JC@HR&H12Zp`Mz~1Gj4$-hARTi>k-Z@0oT!lI17WGO%1Z z^b4@%GxQ6=hD<8;q`C;)-+n!1VQ+P@-ZZp=l>vVp&Y`P?`vzFP9Qq~L8M=CgekoWj zS-%PH&kDA`BUujpsfFFuWpMgr=$C`#GW09Jb}XMsTnRRhT892DuzZI8ZLl3@66&ex zJK+B}^dp-?zY59nlj>@)Tsib>u;nxKYr%$0D)prLF1Ww_`h`Wk)p8iWwO6n*;P1gX zbhU8b2g{d3zYaS?SI^L|2dgFP55WCd!4CZ>mP4PnxVyRmPM-|@MzCCl{zI@G%V!cl z0-HxIL%#_upP~O4Y{!{|dTRO!xLuQvl^2%vPP-Y(vXf#3SgsuQE!grI_D{ivN(%L) zxE0*rcD<tkWw5uwIc&9Xw}a)&Vc&tBVXJ4@cY@WD^)7IKR}Ba*lOW^1C}p`{Rno3 zt)5~37Oa-6zXSJY1v~7cSq}T|CEeAdaQbA}zX!`@*na@qv3w@+7}z{&8TLxBe1`o; zupMU->Z$2Z;C4-KJ;RUoaZ>#m$?}uxFJQTH=#OK|XXt+g8#1ZX^M5x_fXnu6-BJ0* z_ct{4D|wlli~XdpKa$L*`L730f&K9xY!Dkyv*i4Hg*b0<&(trRw$8@s{8^M|SSjbw z!t*&id+N#ax;mb(r_Jjf`2yPWO}+IJ`(izJUT^hxm={@jUHu1GPx-v_y#$ueeR~-! zm;3e#cp6JS!+aGiU%vCbhAp4!U+-v)ZafE(@^wg~Z?wuky{q~stc5#E|7!FmxGec! z*!sw)_f2SQ*tL*zASlAC;w-vkeUaB-(X`(#(|Psuc<>i>n-Mw zt~WSia6NJ9uu-cZos4Vbp)L93rCrr9q@k>ow<=gJI`6Bl$eN%+yTIxG zp#@{6j={FP#9tpl*cL=u3*uH)=^wFYKz` zgR~JVoo@`5OXu$eTY-Ekdmq@4YUz9|SU#O^0^X37%G6WYrr>mb{Gu^aH^a8P#NQlS zuI&8%*z)Oo3$Sq#Up?`+?5s!BqZcn8TyM2(*r=^gt}B`!*Hr7%7k5=#BaLIF`E9^* zX?|O+>WRN|XMNR~qw9<6)}h}8seJv|wIyG3L07dK(ypv@KOQWX?mrB+3i(vGJJ^tF z>3#xOKHYx=yfZ7+si(S+g46x=XO5Y=2X^_Iu_v}%+5KMF^6CC#VB;jddgAZhS?_b! z=z6y$t?nlxmG1+STJk+hx~hGUCb81}$H8*xelpl9HdJT#?0IwyZpZY1h!n+{Q=nW>Ha{laS~tMfAY&$vsdlQsok$?uWvRw_`my( G#{U7`TQc|n delta 9568 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 LPxYHW>J<0^DH%^O diff --git a/axon/shaders/gpu_minuspool.spv b/axon/shaders/gpu_minuspool.spv index 2b6a228b075974b88c55a79dd423862e426898e5..ca13d47f959c882e8cf62da95bde0b2b1f965210 100644 GIT binary patch delta 36 qcmZp9!r1YIaYL85C>w(^0|SF!YH5*kVnAY1Vs0^zyLq;FW)uL{#S1V1 delta 32 ncmeBp!r1bJaYL85AS;710|SF|VsJrrKw?p1Zt>>%;+atZuZ9Z4 diff --git a/axon/shaders/gpu_newstate_neuron.spv b/axon/shaders/gpu_newstate_neuron.spv index a7fb4929c99f7956c0b9d3406d8c0073ed99ce8b..a5597009d4536aaecfb2fc215c14e0a236e88805 100644 GIT binary patch literal 36368 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 literal 35916 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 HqwD_w)YiQ3 diff --git a/axon/shaders/gpu_newstate_pool.spv b/axon/shaders/gpu_newstate_pool.spv index 0baed3cecfbbfa62819bbc77c4bc2931a9d6efa7..4e1070cdd9c9b7ea7aa9dd88a64a912fc3872842 100644 GIT binary patch delta 824 zcmY+=PfG$p7zXgs)a<{tmdA<;>{cnA3Km?*4#t8Vf&`mNh%ni#q#&@MQzv0Mb@JBL z+K}2^MFroZu<&@)57sL?OG~HXc`AI>g*qLYZ&bpfb<0q_lt^=jE&a?~poI zTA?}bbv+`2fth`BOu4e^KDfFyBN1GLx)+PhP z$800F>B>DCT#yUj#s9X^Aj~6%24O{G;=bgxUAaSNnD}y;1at=5C5Fmid&E!~tU?Tx z!48O_GT1ROS=p(=6N2ar2kXSp87v@%%3znoP#Nr+7%GF^ir@X8NH6@VyhN9Sh`#B% z9GIKl5i>XKh}WvK)Fl&hx1O{u7GpJ;fVMxv@9O-_K!&-32acF)#l*w;hUhesVYZb| F{{ifMTLl0B delta 211 zcmZ25i|Ni3rVX3K1z8zX7#J9w6N3w~0}_i8bBi}07f%$BcTR-xfN~6M46F=F2j*}l2 K2yd!X5CH)6I4S%9 diff --git a/axon/shaders/gpu_plusneuron.spv b/axon/shaders/gpu_plusneuron.spv index 27e71643aa3b4df8546bd14551ecf4c4ed3557e6..7c66309ccf14e3448303270ea863db22812cf754 100644 GIT binary patch delta 9880 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 delta 9788 zcmZ{p2bdPs6^3UQ5KvgbRj~wD?1&W`Ccy-aiLrtPtifFY3t|Z-F$wB`qM~B`v0(kN zixn#(Dt7FOy<@M~Q54a<@9doAf-uh>?svXZ=a!k-W$f9tbH>$nY*o8@+bpZevaBxK zVp7L>T{^eP)5wCCX;@*)9XfY{?2)z3`ZJC~I#&)Fv|&xx%J@MI z-8N5bCxW*~^fBOGl~)EetZ0$Qa0<8{S(S`qE8PayZ+t3R>%`+U@KT9>I(UghKcg~a za6`W{VR{pHB;#2~E986rtuT7c1rJ~xhs?=pi?LtUrnrl<;f(R>leNo6FrHI+VQ|Bm z=ZcUMO3(Aaddr9B_{xey8uIgD#v?c3*~EAOqPP6j^d)y8B5z+8F?#)oP5xp;&fdg7 zFxtDiy!YmeUxL`tNo7Y>FdfwuhG=O*4!MQBax%CEN|)gY6zVo;2LlmFbdtkxW|cLeZv1*@WTElC;r!g z^$Gv$3;%q6M{csTzzyg+MZk?kz=Hm1ft#@FGrFAgNnjV(JR?i)X0W`zeb}HQsGr?} zv_YI29pVme1#63hw}F|mA~+J>j&4G2MMB0qkjSS!@=Y#neX_RMSn!=l-iv=MY_Yie zzThc{4t=ur*-?ylA*rti&_fq71Hn@f{UYXW@SlZQiffp!L={B@JzaLghcs;PN7rM9Lv!ZM#dl0OjG0xFLNSgUrbZYh!DD?PZVw$HaZ=G4_2}H*z^yFfKysMan zr@;C}%+rgBarZ{dGhqE9=2?x4n!0qlXW;W}8RT?7w}=??q|^O;=@+x`!eU~&r_=o+ zPC7==OKDJL*3d5b%P_Lh|0}5n*hRFJbe>*C*DqpT1225b#wamQuY>iAm^Z+`+ARiH zFoNC$>li_AffrTij3j0zSig9Fy$w!deBQYp`a**g$AMZmjhK&9KT`mXQ6$cD%J z3wZP!R-bowD z(|=whh~l##&qF36!F>+)d|Zb_@E2fxwFUPjSiXw*VD%aJ719>5A?>j`UxT%c&hqAO zg>O(?!nDY@=oZlyMP`HLt4I|24je_aZ^cVj&LVLW--AaYY5qCrvn<+dY;NQSbPZJ` z3j7F;0@~v)=7P0Fk)Ob$khI7=bZ-naLXH!&=8wFNU|$io9$!>-aPsC@n$gQID)~-` zoO#5zmU%jZshwwyIQy9uPL8vg?I!qTz=IfVzyK3iq@K~sBKj-Ar=x(F7Iw-uz3gL zYusY~mU4 z+&ALvR@oHnWgy0EGh}nbKyfV47GUGv#Mk*TP9J^4r&sASb0HsnV-B~h$@!%f!sG^+ zz(#({=oL?c-=SN;G4A^JV838?LyYNN#@M{Jtq?im#5QVPb@@WiOF~0*^#||)BsIvT z(K+twkKip4eS+%)c8Ro^)akc~Qyx2FYcM~w);x2uv>mr84Q`38EB%Jo=YN8+td`gj z+k*W>im*SIQSJzB5fd%_1lk-o?8MlYu{~oy#yMGDTNvWCwkzal zjOn{`H#py&+TzXhH?VvaJ{s(JOY^9{1J9o$xR;Jpwz zS6Cd|ac}SwB=Y6tl!uR_Q{Du>57>8#x%D^RCjQRoWsO{?frz9<#3r;;b@}EO2>S%g zPx0%CUmf0AEJGt$yT5{1q)A6Ei)h;qku#^beA4FGAe2ZJ`*$!LKZJ4zfOy#q0c(2( z-Xi@<-h{(&6uXTl`Vr_}25S2!B4?mDn*A5pW{tDi@NtZ0{|&ZT3+ivY zzGWkM0mAu6jP6+P+CUS^LNz5gu*%DqK7xMxw_no z=-nO5=;ht{LOl){jaXD1NA7sAagF#IcLLbUIBh2)V-VxS@wh$-Y@F}Y;;YC&opcVT zlS`+WIC`%~Ka| z#XzWwpfOo(oRjr{|SXJ@L~PG12CDI6KlW?a0pJHqQs!xwo#r-Le~- z-=`N8%7U-43*mf?X^Sm-5m>$oA6xWd^mvVFkJs2GU~MjNmC-8}cmldpHo@nqXQv6{ zrI2-qXUjuv;AQAuF0%H^5jlg!-mS^i<>SqB1(=`WHy0amhGQpPi9Q{@czWd&xk^ti zi)g$Wxdt(*INl}`!6qJzugzTx_A*Y}b;$LIapG8>8^A;GGuDQU(?{PteuKCX#V&P< zz?;AZYD)u65bHV#Yyk`EZ&H1|DT{a`k?&@(zqweW<$Zb!%EEMf8(u@-v{urh)(w-auyNWxt*%Z#}0o0%uma=l}bG59|UWUZ>xuNk) z=7kcQ@DWJAtxOh=vgu%c2;~pifLP;4!P?^6>M@5a%Ye_JvCPoS8{ zj#DQ)Om$}=zO9}FySC2I3`Pr>$HeLp8+*nvVxI!LUwo;bpYu-@aU;30G^B-|Mn4+S z*@F5y>T46J?=$FbHhta1`nnPImDe|p;BigGiM$o~@f1Y(lkS@P^=mz$x6$2FjLjhZ1PALkaE+o&}b7+0;J= z%N-1Upya+lm){-kk&^ooU4EFW;pQ;-D~LlFHAe8)VEMh_qsTYt@`u7j?6>IhY3yut z`F)bu@6hEBYl&t3zlYF}2G2p4-wVfM%Lacymp{BEm}x|pPh;nz%kP;K{t4Y#&~_BF z=YKHF1OJqlgdeFtgC)}?a4F*T^b5EVKbJ{gmnU{TtCeYYuf&F~fpfXErTfQy6gl%+ zjBYwNp#c_*HE)IP(a|T8wg!8|rjgeT)dt-wHsKQJ?j6TCC2hfkaNh_xPD#63)?Z^B zllEXQcPGYdNkq*zs zFB{R;36V3g*y%K}x_r!7XRxQlTyaX40n5h*t_RB%rz9^o*Rl{A(qpn5x;)3EWv4HX z?kUk0r=$y5K0PHXpv$MHWJPrOG&WxeLPL5?Rz{bfe@ys0F}i#j+!b9uJteE4%crNL z0bM?gT@@WZU*MQ@gLD=&#xYq9EU)e95_5}z+|8fG&)PGFZ$23QpA7&@4-b9- delta 39 vcmX@Im+`<}#to0e1z8!?7#J9w6N3w~0}_i8bBi~B7e8yy7`*vt_Oe(h delta 315 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 delta 17745 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 delta 160 zcmdnf%J`>#!wL?0=fr@-qQu-{1|VQ#U}X>mF@PYrATvAFoni8E4$sX2Tp9wCcSyfr zEZDqIW;v6l0V4y02T(0HP#qT#D+93uk{C!FBo;8aP+nLy0ZE1zDpLRyb7x>-&;s(= YfOx{@mGY(>jO>%|t4nUS&}fkY07!NmNdN!< diff --git a/axon/typegen.go b/axon/typegen.go index 0fd4e0a5d..5cd82a0b2 100644 --- a/axon/typegen.go +++ b/axon/typegen.go @@ -92,8 +92,6 @@ var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.LayerValue var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.CaLrnParams", IDName: "ca-lrn-params", Doc: "CaLrnParams parameterizes the neuron-level calcium signals driving learning:\nCaLrn = NMDA + VGCC Ca sources, where VGCC can be simulated from spiking or\nuse the more complex and dynamic VGCC channel directly.\nCaLrn is then integrated in a cascading manner at multiple time scales:\nCaM (as in calmodulin), CaP (ltP, CaMKII, plus phase), CaD (ltD, DAPK1, minus phase).", Directives: []types.Directive{{Tool: "gosl", Directive: "hlsl", Args: []string{"learn_neur"}}, {Tool: "gosl", Directive: "end", Args: []string{"learn_neur"}}, {Tool: "gosl", Directive: "start", Args: []string{"learn_neur"}}}, Fields: []types.Field{{Name: "Norm", Doc: "denomenator used for normalizing CaLrn, so the max is roughly 1 - 1.5 or so, which works best in terms of previous standard learning rules, and overall learning performance"}, {Name: "SpkVGCC", Doc: "use spikes to generate VGCC instead of actual VGCC current -- see SpkVGCCa for calcium contribution from each spike"}, {Name: "SpkVgccCa", Doc: "multiplier on spike for computing Ca contribution to CaLrn in SpkVGCC mode"}, {Name: "VgccTau", Doc: "time constant of decay for VgccCa calcium -- it is highly transient around spikes, so decay and diffusion factors are more important than for long-lasting NMDA factor. VgccCa is integrated separately int VgccCaInt prior to adding into NMDA Ca in CaLrn"}, {Name: "Dt", Doc: "time constants for integrating CaLrn across M, P and D cascading levels"}, {Name: "UpdateThr", Doc: "Threshold on CaSpkP CaSpkD value for updating synapse-level Ca values (SynCa) -- this is purely a performance optimization that excludes random infrequent spikes -- 0.05 works well on larger networks but not smaller, which require the .01 default."}, {Name: "VgccDt", Doc: "rate = 1 / tau"}, {Name: "NormInv", Doc: "= 1 / Norm"}, {Name: "pad"}}}) -var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.CaSpkParams", IDName: "ca-spk-params", Doc: "CaSpkParams parameterizes the neuron-level spike-driven calcium\nsignals, starting with CaSyn that is integrated at the neuron level\nand drives synapse-level, pre * post Ca integration, which provides the Tr\ntrace that multiplies error signals, and drives learning directly for Target layers.\nCaSpk* values are integrated separately at the Neuron level and used for UpdateThr\nand RLRate as a proxy for the activation (spiking) based learning signal.", Fields: []types.Field{{Name: "SpikeG", Doc: "gain multiplier on spike for computing CaSpk: increasing this directly affects the magnitude of the trace values, learning rate in Target layers, and other factors that depend on CaSpk values: RLRate, UpdateThr. Path.KinaseCa.SpikeG provides an additional gain factor specific to the synapse-level trace factors, without affecting neuron-level CaSpk values. Larger networks require higher gain factors at the neuron level -- 12, vs 8 for smaller."}, {Name: "SynTau", Doc: "time constant for integrating spike-driven calcium trace at sender and recv neurons, CaSyn, which then drives synapse-level integration of the joint pre * post synapse-level activity, in cycles (msec). Note: if this param is changed, then there will be a change in effective learning rate that can be compensated for by multiplying PathParams.Learn.KinaseCa.SpikeG by sqrt(30 / sqrt(SynTau)"}, {Name: "SynDt", Doc: "rate = 1 / tau"}, {Name: "pad"}, {Name: "Dt", Doc: "time constants for integrating CaSpk across M, P and D cascading levels -- these are typically the same as in CaLrn and Path level for synaptic integration, except for the M factor."}}}) - var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.TrgAvgActParams", IDName: "trg-avg-act-params", Doc: "TrgAvgActParams govern the target and actual long-term average activity in neurons.\nTarget value is adapted by neuron-wise error and difference in actual vs. target.\ndrives synaptic scaling at a slow timescale (Network.SlowInterval).", Fields: []types.Field{{Name: "GiBaseInit", Doc: "if this is > 0, then each neuron's GiBase is initialized as this proportion of TrgRange.Max - TrgAvg -- gives neurons differences in intrinsic inhibition / leak as a starting bias. This is independent of using the target values to scale synaptic weights."}, {Name: "RescaleOn", Doc: "whether to use target average activity mechanism to rescale synaptic weights, so that activity tracks the target values"}, {Name: "ErrLRate", Doc: "learning rate for adjustments to Trg value based on unit-level error signal. Population TrgAvg values are renormalized to fixed overall average in TrgRange. Generally, deviating from the default doesn't make much difference."}, {Name: "SynScaleRate", Doc: "rate parameter for how much to scale synaptic weights in proportion to the AvgDif between target and actual proportion activity -- this determines the effective strength of the constraint, and larger models may need more than the weaker default value."}, {Name: "SubMean", Doc: "amount of mean trg change to subtract -- 1 = full zero sum. 1 works best in general -- but in some cases it may be better to start with 0 and then increase using network SetSubMean method at a later point."}, {Name: "Permute", Doc: "permute the order of TrgAvg values within layer -- otherwise they are just assigned in order from highest to lowest for easy visualization -- generally must be true if any topographic weights are being used"}, {Name: "Pool", Doc: "use pool-level target values if pool-level inhibition and 4D pooled layers are present -- if pool sizes are relatively small, then may not be useful to distribute targets just within pool"}, {Name: "pad"}, {Name: "TrgRange", Doc: "range of target normalized average activations -- individual neurons are assigned values within this range to TrgAvg, and clamped within this range."}}}) var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.RLRateParams", IDName: "rl-rate-params", Doc: "RLRateParams are recv neuron learning rate modulation parameters.\nHas two factors: the derivative of the sigmoid based on CaSpkD\nactivity levels, and based on the phase-wise differences in activity (Diff).", Fields: []types.Field{{Name: "On", Doc: "use learning rate modulation"}, {Name: "SigmoidLinear", Doc: "use a linear sigmoid function: if act > .5: 1-act; else act\notherwise use the actual sigmoid derivative which is squared: a(1-a)"}, {Name: "SigmoidMin", Doc: "minimum learning rate multiplier for sigmoidal act (1-act) factor,\nwhich prevents lrate from going too low for extreme values.\nSet to 1 to disable Sigmoid derivative factor, which is default for Target layers."}, {Name: "Diff", Doc: "modulate learning rate as a function of plus - minus differences"}, {Name: "SpkThr", Doc: "threshold on Max(CaSpkP, CaSpkD) below which Min lrate applies.\nmust be > 0 to prevent div by zero."}, {Name: "DiffThr", Doc: "threshold on recv neuron error delta, i.e., |CaSpkP - CaSpkD| below which lrate is at Min value"}, {Name: "Min", Doc: "for Diff component, minimum learning rate value when below ActDiffThr"}, {Name: "pad"}}}) diff --git a/go.mod b/go.mod index 9399ff1ec..da33c8a49 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/pelletier/go-toml/v2 v2.1.2-0.20240227203013-2b69615b5d55 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/sajari/regression v1.0.1 // indirect golang.org/x/image v0.15.0 // indirect golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.23.0 // indirect diff --git a/go.sum b/go.sum index 8a5885991..c339e0902 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sajari/regression v1.0.1 h1:iTVc6ZACGCkoXC+8NdqH5tIreslDTT/bXxT6OmHR5PE= +github.com/sajari/regression v1.0.1/go.mod h1:NeG/XTW1lYfGY7YV/Z0nYDV/RGh3wxwd1yW46835flM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= diff --git a/kinase/linear.go b/kinase/linear.go index 35134bd88..a88ec1622 100644 --- a/kinase/linear.go +++ b/kinase/linear.go @@ -8,26 +8,10 @@ import ( "fmt" "math/rand" + "cogentcore.org/core/tensor" "cogentcore.org/core/tensor/table" "github.com/chewxy/math32" -) - -type LinearState int - -const ( - StartCaSyn LinearState = iota - StartCaM - StartCaP - StartCaD - - FinalCaSyn - FinalCaM - FinalCaP - FinalCaD - - TotalSpikes - - NLinearState + "github.com/sajari/regression" ) // Linear performs a linear regression to approximate the synaptic Ca @@ -39,9 +23,6 @@ type Linear struct { // Kinase Synapse params Synapse SynCaParams - // gain on S*R product for BinnedSums - BinProd float32 `default:"10"` - // total number of cycles (1 MSec) to run NCycles int `min:"10" default:"200"` @@ -91,13 +72,12 @@ type Linear struct { func (ls *Linear) Defaults() { ls.Neuron.Defaults() ls.Synapse.Defaults() - ls.BinProd = 10 ls.NCycles = 200 ls.PlusCycles = 50 - ls.CyclesPerBin = 25 - ls.MaxHz = 120 + ls.CyclesPerBin = 50 + ls.MaxHz = 100 ls.StepHz = 10 - ls.NTrials = 10 + ls.NTrials = 2 ls.Update() } @@ -124,7 +104,7 @@ func (ls *Linear) InitTable() { if ls.Data.NumColumns() > 0 { return } - nneur := int(NLinearState*2) + ls.NumBins + nneur := ls.NumBins ls.Data.AddIntColumn("Trial") ls.Data.AddFloat64TensorColumn("Hz", []int{4}, "Send*Recv*Minus*Plus") ls.Data.AddFloat64TensorColumn("State", []int{nneur}, "States") @@ -154,9 +134,6 @@ type Neuron struct { // neuron-level spike-driven Ca integration CaSpkM, CaSpkP, CaSpkD float32 - // regression variables - StartCaSyn float32 - TotalSpikes float32 // binned count of spikes, for regression learning @@ -174,7 +151,6 @@ func (kn *Neuron) Init() { } func (kn *Neuron) StartTrial() { - kn.StartCaSyn = kn.CaSyn kn.TotalSpikes = 0 for i := range kn.BinnedSpikes { kn.BinnedSpikes[i] = 0 @@ -250,14 +226,6 @@ func (ls *Linear) Run() { } } } - fmt.Println("row:", row) -} - -func (ls *Linear) SetNeurState(nr *Neuron, off, row int) { - ls.Data.SetTensorFloat1D("State", row, off, float64(nr.CaSyn)) - ls.Data.SetTensorFloat1D("State", row, off+1, float64(nr.CaSpkM)) - ls.Data.SetTensorFloat1D("State", row, off+2, float64(nr.CaSpkP)) - ls.Data.SetTensorFloat1D("State", row, off+3, float64(nr.CaSpkD)) } func (ls *Linear) SetSynState(sy *Synapse, row int) { @@ -270,7 +238,7 @@ func (ls *Linear) SetSynState(sy *Synapse, row int) { func (ls *Linear) SetBins(sn, rn *Neuron, off, row int) { for i, s := range sn.BinnedSpikes { r := rn.BinnedSpikes[i] - bs := r + s + ls.BinProd*r*s + bs := (r * s) / 10.0 ls.BinnedSums[i] = bs ls.Data.SetTensorFloat1D("State", row, off+i, float64(bs)) } @@ -286,10 +254,6 @@ func (ls *Linear) Trial(sendMinusHz, sendPlusHz, recvMinusHz, recvPlusHz float32 ls.Data.SetTensorFloat1D("Hz", row, 2, float64(recvMinusHz)) ls.Data.SetTensorFloat1D("Hz", row, 3, float64(recvPlusHz)) - // capture starting - ls.SetNeurState(&ls.Send, 0, row) - ls.SetNeurState(&ls.Recv, int(NLinearState), row) - minusCycles := ls.NCycles - ls.PlusCycles ls.StartTrial() @@ -321,9 +285,37 @@ func (ls *Linear) Trial(sendMinusHz, sendPlusHz, recvMinusHz, recvPlusHz float32 ls.StdSyn.DWt = ls.StdSyn.CaP - ls.StdSyn.CaD // capture final - ls.SetNeurState(&ls.Send, int(FinalCaSyn), row) - ls.SetNeurState(&ls.Recv, int(NLinearState+FinalCaSyn), row) + // ls.SetNeurState(&ls.Send, int(FinalCa), row) + // ls.SetNeurState(&ls.Recv, int(NLinearState+FinalCa), row) + // ls.Data.SetTensorFloat1D("State", row, int(TotalSpikes), float64(ls.Send.TotalSpikes)) + // ls.Data.SetTensorFloat1D("State", row, int(NLinearState+TotalSpikes), float64(ls.Recv.TotalSpikes)) ls.SetSynState(&ls.StdSyn, row) - ls.SetBins(&ls.Send, &ls.Recv, int(NLinearState*2), row) + ls.SetBins(&ls.Send, &ls.Recv, 0, row) +} + +// Regress runs the linear regression on the data +func (ls *Linear) Regress() { + for vi := 0; vi < 4; vi++ { + r := new(regression.Regression) + r.SetObserved("CaD") + for bi := 0; bi < ls.NumBins; bi++ { + r.SetVar(bi, fmt.Sprintf("Bin_%d", bi)) + } + + for row := 0; row < ls.Data.Rows; row++ { + st := ls.Data.Tensor("State", row).(*tensor.Float64) + cad := ls.Data.TensorFloat1D("StdCa", row, vi) + r.Train(regression.DataPoint(cad, st.Values)) + } + r.Run() + fmt.Printf("Regression formula:\n%v\n", r.Formula) + fmt.Printf("Variance observed = %v\nVariance Predicted = %v", r.Varianceobserved, r.VariancePredicted) + fmt.Printf("\nR2 = %v\n", r.R2) + str := "{" + for ci := 0; ci <= ls.NumBins; ci++ { + str += fmt.Sprintf("%8.6g, ", r.Coeff(ci)) + } + fmt.Println(str + "}") + } } diff --git a/kinase/linear_test.go b/kinase/linear_test.go new file mode 100644 index 000000000..54c041a50 --- /dev/null +++ b/kinase/linear_test.go @@ -0,0 +1,20 @@ +// Copyright (c) 2024, The Emergent Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package kinase + +import ( + "testing" + + "cogentcore.org/core/tensor/table" +) + +func TestLinear(t *testing.T) { + var ls Linear + ls.Defaults() + ls.Init() + ls.Run() + ls.Data.SaveCSV("linear_data.tsv", table.Tab, table.Headers) + ls.Regress() +} diff --git a/kinase/params.go b/kinase/params.go index fdeeb6757..dae3dd5cb 100644 --- a/kinase/params.go +++ b/kinase/params.go @@ -157,6 +157,12 @@ type SynCaParams struct { //types:add // time constants for integrating at M, P, and D cascading levels Dt CaDtParams `view:"inline"` + + // Linear coefficients + CaMb, CaPb, CaDb, pad4 float32 + CaM0, CaM1, CaM2, CaM3 float32 + CaP0, CaP1, CaP2, CaP3 float32 + CaD0, CaD1, CaD2, CaD3 float32 } func (kp *SynCaParams) Defaults() { @@ -164,6 +170,24 @@ func (kp *SynCaParams) Defaults() { kp.MaxISI = 100 kp.Dt.Defaults() kp.Update() + + kp.CaMb = 0.134963 + kp.CaM0 = -0.120041 + kp.CaM1 = 0.219127 + kp.CaM2 = 0.610898 + kp.CaM3 = 2.12086 + + kp.CaPb = 0.177911 + kp.CaP0 = 0.078137 + kp.CaP1 = 0.591 + kp.CaP2 = 0.986568 + kp.CaP3 = 1.13846 + + kp.CaDb = 0.163643 + kp.CaD0 = 0.373198 + kp.CaD1 = 0.890947 + kp.CaD2 = 1.01732 + kp.CaD3 = 0.554418 } func (kp *SynCaParams) Update() { @@ -214,4 +238,17 @@ func (kp *SynCaParams) CurCa(ctime, utime float32, caM, caP, caD *float32) { return } +// FinalCa uses a linear regression to compute the final Ca values +func (kp *SynCaParams) FinalCa(bin0, bin1, bin2, bin3 float32, caM, caP, caD *float32) { + if bin0+bin1+bin2+bin3 < 0.1 { + *caM = 0 + *caP = 0 + *caD = 0 + return + } + *caM = kp.CaMb + kp.CaM0*bin0 + kp.CaM1*bin1 + kp.CaM2*bin2 + kp.CaM3*bin3 + *caP = kp.CaPb + kp.CaP0*bin0 + kp.CaP1*bin1 + kp.CaP2*bin2 + kp.CaP3*bin3 + *caD = kp.CaDb + kp.CaD0*bin0 + kp.CaD1*bin1 + kp.CaD2*bin2 + kp.CaD3*bin3 +} + //gosl:end kinase diff --git a/kinase/typegen.go b/kinase/typegen.go index ea127b610..ef7fe3dce 100644 --- a/kinase/typegen.go +++ b/kinase/typegen.go @@ -6,8 +6,16 @@ import ( "cogentcore.org/core/types" ) +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.Linear", IDName: "linear", Doc: "Linear performs a linear regression to approximate the synaptic Ca\nintegration between send and recv neurons.", Fields: []types.Field{{Name: "Neuron", Doc: "Kinase Neuron params"}, {Name: "Synapse", Doc: "Kinase Synapse params"}, {Name: "BinProd", Doc: "gain on S*R product for BinnedSums"}, {Name: "NCycles", Doc: "total number of cycles (1 MSec) to run"}, {Name: "PlusCycles", Doc: "number of plus cycles"}, {Name: "CyclesPerBin", Doc: "CyclesPerBin specifies the bin size for accumulating spikes"}, {Name: "NumBins", Doc: "NumBins = NCycles / CyclesPerBin"}, {Name: "MaxHz", Doc: "MaxHz is the maximum firing rate to sample in minus, plus phases"}, {Name: "StepHz", Doc: "StepHz is the step size for sampling Hz"}, {Name: "NTrials", Doc: "NTrials is number of trials per Hz case"}, {Name: "TotalTrials", Doc: "Total Trials is number of trials for all data"}, {Name: "Send", Doc: "Sending neuron"}, {Name: "Recv", Doc: "Receiving neuron"}, {Name: "StdSyn", Doc: "Standard synapse values"}, {Name: "LinearSyn", Doc: "Linear synapse values"}, {Name: "ErrDWt", Doc: "ErrDWt is the target error dwt: PlusHz - MinusHz"}, {Name: "BinnedSums", Doc: "binned integration of send, recv spikes"}, {Name: "Data", Doc: "Data to fit the regression"}}}) + +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.Neuron", IDName: "neuron", Doc: "Neuron has Neuron state", Fields: []types.Field{{Name: "Spike", Doc: "Neuron spiking (0,1)"}, {Name: "SpikeP", Doc: "Neuron probability of spiking"}, {Name: "CaSyn", Doc: "CaSyn is spike-driven calcium trace for synapse-level Ca-driven learning: exponential integration of SpikeG * Spike at SynTau time constant (typically 30). Synapses integrate send.CaSyn * recv.CaSyn across M, P, D time integrals for the synaptic trace driving credit assignment in learning. Time constant reflects binding time of Glu to NMDA and Ca buffering postsynaptically, and determines time window where pre * post spiking must overlap to drive learning."}, {Name: "CaSpkM", Doc: "neuron-level spike-driven Ca integration"}, {Name: "CaSpkP", Doc: "neuron-level spike-driven Ca integration"}, {Name: "CaSpkD", Doc: "neuron-level spike-driven Ca integration"}, {Name: "TotalSpikes"}, {Name: "BinnedSpikes", Doc: "binned count of spikes, for regression learning"}}}) + +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.Synapse", IDName: "synapse", Doc: "Synapse has Synapse state", Fields: []types.Field{{Name: "CaSyn"}, {Name: "CaM", Doc: "CaM is first stage running average (mean) Ca calcium level (like CaM = calmodulin), feeds into CaP"}, {Name: "CaP", Doc: "CaP is shorter timescale integrated CaM value, representing the plus, LTP direction of weight change and capturing the function of CaMKII in the Kinase learning rule"}, {Name: "CaD", Doc: "CaD is longer timescale integrated CaP value, representing the minus, LTD direction of weight change and capturing the function of DAPK1 in the Kinase learning rule"}, {Name: "DWt", Doc: "DWt is the CaP - CaD"}}}) + var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.CaDtParams", IDName: "ca-dt-params", Doc: "CaDtParams has rate constants for integrating Ca calcium\nat different time scales, including final CaP = CaMKII and CaD = DAPK1\ntimescales for LTP potentiation vs. LTD depression factors.", Directives: []types.Directive{{Tool: "gosl", Directive: "start", Args: []string{"kinase"}}, {Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "MTau", Doc: "CaM (calmodulin) time constant in cycles (msec) -- for synaptic-level integration this integrates on top of Ca signal from send->CaSyn * recv->CaSyn, each of which are typically integrated with a 30 msec Tau."}, {Name: "PTau", Doc: "LTP spike-driven Ca factor (CaP) time constant in cycles (msec), simulating CaMKII in the Kinase framework, with 40 on top of MTau roughly tracking the biophysical rise time. Computationally, CaP represents the plus phase learning signal that reflects the most recent past information."}, {Name: "DTau", Doc: "LTD spike-driven Ca factor (CaD) time constant in cycles (msec), simulating DAPK1 in Kinase framework. Computationally, CaD represents the minus phase learning signal that reflects the expectation representation prior to experiencing the outcome (in addition to the outcome). For integration equations, this cannot be identical to PTau."}, {Name: "ExpAdj", Doc: "if true, adjust dt time constants when using exponential integration equations to compensate for difference between discrete and continuous integration"}, {Name: "MDt", Doc: "rate = 1 / tau"}, {Name: "PDt", Doc: "rate = 1 / tau"}, {Name: "DDt", Doc: "rate = 1 / tau"}, {Name: "M4Dt", Doc: "4 * rate = 1 / tau"}, {Name: "P4Dt", Doc: "4 * rate = 1 / tau"}, {Name: "D4Dt", Doc: "4 * rate = 1 / tau"}, {Name: "pad"}, {Name: "pad1"}}}) -var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.CaParams", IDName: "ca-params", Doc: "CaParams has rate constants for integrating spike-driven Ca calcium\nat different time scales, including final CaP = CaMKII and CaD = DAPK1\ntimescales for LTP potentiation vs. LTD depression factors.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "SpikeG", Doc: "spiking gain factor for SynSpk learning rule variants. This alters the overall range of values, keeping them in roughly the unit scale, and affects effective learning rate."}, {Name: "MaxISI", Doc: "maximum ISI for integrating in Opt mode -- above that just set to 0"}, {Name: "pad"}, {Name: "pad1"}, {Name: "Dt", Doc: "time constants for integrating at M, P, and D cascading levels"}}}) +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.NeurCaParams", IDName: "neur-ca-params", Doc: "NeurCaParams parameterizes the neuron-level spike-driven calcium\nsignals, starting with CaSyn that is integrated at the neuron level\nand drives synapse-level, pre * post Ca integration, which provides the Tr\ntrace that multiplies error signals, and drives learning directly for Target layers.\nCaSpk* values are integrated separately at the Neuron level and used for UpdateThr\nand RLRate as a proxy for the activation (spiking) based learning signal.", Fields: []types.Field{{Name: "SpikeG", Doc: "SpikeG is a gain multiplier on spike impulses for computing CaSpk:\nincreasing this directly affects the magnitude of the trace values,\nlearning rate in Target layers, and other factors that depend on CaSpk\nvalues, including RLRate, UpdateThr.\nLarger networks require higher gain factors at the neuron level:\n12, vs 8 for smaller."}, {Name: "SynTau", Doc: "time constant for integrating spike-driven calcium trace at sender and recv\nneurons, CaSyn, which then drives synapse-level integration of the\njoint pre * post synapse-level activity, in cycles (msec).\nNote: if this param is changed, then there will be a change in effective\nlearning rate that can be compensated for by multiplying\nPathParams.Learn.KinaseCa.CaScale by sqrt(30 / sqrt(SynTau)"}, {Name: "SynDt", Doc: "rate = 1 / tau"}, {Name: "pad"}, {Name: "Dt", Doc: "time constants for integrating CaSpk across M, P and D cascading levels -- these are typically the same as in CaLrn and Path level for synaptic integration, except for the M factor."}}}) + +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.SynCaParams", IDName: "syn-ca-params", Doc: "SynCaParams has rate constants for integrating spike-driven Ca calcium\nat different time scales, including final CaP = CaMKII and CaD = DAPK1\ntimescales for LTP potentiation vs. LTD depression factors.", Directives: []types.Directive{{Tool: "types", Directive: "add"}}, Fields: []types.Field{{Name: "CaScale", Doc: "CaScale is a scaling multiplier on synaptic Ca values,\nwhich due to the multiplication of send * recv are smaller in magnitude.\nThe default 12 value keeps them in roughly the unit scale,\nand affects effective learning rate."}, {Name: "MaxISI", Doc: "maximum ISI for integrating in Opt mode -- above that just set to 0"}, {Name: "pad"}, {Name: "pad1"}, {Name: "Dt", Doc: "time constants for integrating at M, P, and D cascading levels"}}}) var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/kinase.Rules", IDName: "rules", Doc: "Rules are different options for Kinase-based learning rules\nThese are now implemented using separate Path types in kinasex"})