CARLsim  4.1.0
CARLsim: a GPU-accelerated SNN simulator
print_snn_info.cpp
Go to the documentation of this file.
1 /* * Copyright (c) 2016 Regents of the University of California. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * 3. The names of its contributors may not be used to endorse or promote
15 * products derived from this software without specific prior written
16 * permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * *********************************************************************************************** *
31 * CARLsim
32 * created by: (MDR) Micah Richert, (JN) Jayram M. Nageswaran
33 * maintained by:
34 * (MA) Mike Avery <averym@uci.edu>
35 * (MB) Michael Beyeler <mbeyeler@uci.edu>,
36 * (KDC) Kristofor Carlson <kdcarlso@uci.edu>
37 * (TSC) Ting-Shuo Chou <tingshuc@uci.edu>
38 * (HK) Hirak J Kashyap <kashyaph@uci.edu>
39 *
40 * CARLsim v1.0: JM, MDR
41 * CARLsim v2.0/v2.1/v2.2: JM, MDR, MA, MB, KDC
42 * CARLsim3: MB, KDC, TSC
43 * CARLsim4: TSC, HK
44 *
45 * CARLsim available from http://socsci.uci.edu/~jkrichma/CARLsim/
46 * Ver 12/31/2016
47 */
48 
49 #include <snn.h>
51 #include <group_monitor_core.h>
52 
53 void SNN::printStatusConnectionMonitor(int connId) {
54  for (int monId=0; monId<numConnectionMonitor; monId++) {
55  if (connId==ALL || connMonCoreList[monId]->getConnectId()==connId) {
56  // print connection weights (sparse representation: show only actually connected synapses)
57  // show the first hundred connections: (pre=>post) weight
58  connMonCoreList[monId]->printSparse(ALL, 100, 4, false);
59  }
60  }
61 }
62 
63 void SNN::printStatusSpikeMonitor(int gGrpId) {
64  if (gGrpId==ALL) {
65  for (int g = 0; g < numGroups; g++) {
66  printStatusSpikeMonitor(g);
67  }
68  } else {
69  int netId = groupConfigMDMap[gGrpId].netId;
70  int lGrpId = groupConfigMDMap[gGrpId].lGrpId;
71  int monitorId = groupConfigMDMap[gGrpId].spikeMonitorId;
72 
73  if (monitorId == -1) return;
74 
75  // copy data to the manager runtime
76  fetchNeuronSpikeCount(gGrpId);
77 
78  // \TODO nSpikeCnt should really be a member of the SpikeMonitor object that gets populated if
79  // printRunSummary is true or mode==COUNT.....
80  // so then we can use spkMonObj->print(false); // showSpikeTimes==false
81  int grpSpk = 0;
82  for (int gNId = groupConfigMDMap[gGrpId].gStartN; gNId <= groupConfigMDMap[gGrpId].gEndN; gNId++)
83  grpSpk += managerRuntimeData.nSpikeCnt[gNId]; // add up all neuronal spike counts
84 
85  // infer run duration by measuring how much time has passed since the last run summary was printed
86  int runDurationMs = simTime - simTimeLastRunSummary;
87 
88  if (simTime <= simTimeLastRunSummary) {
89  KERNEL_INFO("(t=%.3fs) SpikeMonitor for group %s(%d) has %d spikes in %dms (%.2f +/- %.2f Hz)",
90  (float)(simTime / 1000.0f),
91  groupConfigMap[gGrpId].grpName.c_str(),
92  gGrpId,
93  0,
94  0,
95  0.0f,
96  0.0f);
97  } else {
98  // if some time has passed since last print
99  float meanRate = grpSpk * 1000.0f / runDurationMs / groupConfigMap[gGrpId].numN;
100  float std = 0.0f;
101  if (groupConfigMap[gGrpId].numN > 1) {
102  for (int gNId = groupConfigMDMap[gGrpId].gStartN; gNId <= groupConfigMDMap[gGrpId].gEndN; gNId++) {
103  float neurRate = managerRuntimeData.nSpikeCnt[gNId] * 1000.0f / runDurationMs;
104  std += (neurRate - meanRate) * (neurRate - meanRate);
105  }
106  std = sqrt(std / (groupConfigs[netId][lGrpId].numN - 1.0));
107  }
108 
109  KERNEL_INFO("(t=%.3fs) SpikeMonitor for group %s(%d) has %d spikes in %ums (%.2f +/- %.2f Hz)",
110  simTime / 1000.0f,
111  groupConfigMap[gGrpId].grpName.c_str(),
112  gGrpId,
113  grpSpk,
114  runDurationMs,
115  meanRate,
116  std);
117  }
118  }
119 }
120 
121 void SNN::printStatusGroupMonitor(int gGrpId) {
122  if (gGrpId == ALL) {
123  for (int g = 0; g < numGroups; g++) {
124  printStatusGroupMonitor(g);
125  }
126  } else {
127  int netId = groupConfigMDMap[gGrpId].netId;
128  int lGrpId = groupConfigMDMap[gGrpId].lGrpId;
129  int monitorId = groupConfigMDMap[gGrpId].groupMonitorId;
130 
131  if (monitorId == -1) return;
132 
133  std::vector<int> peakTimeVector = groupMonCoreList[monitorId]->getPeakTimeVector();
134  int numPeaks = peakTimeVector.size();
135 
136  // infer run duration by measuring how much time has passed since the last run summary was printed
137  int runDurationMs = simTime - simTimeLastRunSummary;
138 
139  if (simTime <= simTimeLastRunSummary) {
140  KERNEL_INFO("(t=%.3fs) GroupMonitor for group %s(%d) has %d peak(s) in %dms",
141  simTime / 1000.0f,
142  groupConfigMap[gGrpId].grpName.c_str(),
143  gGrpId,
144  0,
145  0);
146  } else {
147  // if some time has passed since last print
148  KERNEL_INFO("(t=%.3fs) GroupMonitor for group %s(%d) has %d peak(s) in %ums",
149  simTime / 1000.0f,
150  groupConfigMap[gGrpId].grpName.c_str(),
151  gGrpId,
152  numPeaks,
153  runDurationMs);
154  }
155  }
156 }
157 
158 // new print connection info, akin to printGroupInfo
159 void SNN::printConnectionInfo(short int connId) {
160  ConnectConfig connConfig = connectConfigMap[connId];
161 
162  KERNEL_INFO("Connection ID %d: %s(%d) => %s(%d)", connId, groupConfigMap[connConfig.grpSrc].grpName.c_str(),
163  connConfig.grpSrc, groupConfigMap[connConfig.grpDest].grpName.c_str(), connConfig.grpDest);
164  KERNEL_INFO(" - Type = %s", GET_FIXED_PLASTIC(connConfig.connProp)==SYN_PLASTIC?" PLASTIC":" FIXED")
165  KERNEL_INFO(" - Min weight = %8.5f", 0.0f); // \TODO
166  KERNEL_INFO(" - Max weight = %8.5f", fabs(connConfig.maxWt));
167  KERNEL_INFO(" - Initial weight = %8.5f", fabs(connConfig.initWt));
168  KERNEL_INFO(" - Min delay = %8d", connConfig.minDelay);
169  KERNEL_INFO(" - Max delay = %8d", connConfig.maxDelay);
170  KERNEL_INFO(" - Radius X = %8.2f", connConfig.connRadius.radX);
171  KERNEL_INFO(" - Radius Y = %8.2f", connConfig.connRadius.radY);
172  KERNEL_INFO(" - Radius Z = %8.2f", connConfig.connRadius.radZ);
173  KERNEL_INFO(" - Num of synapses = %d", connConfig.numberOfConnections);
174  float avgPostM = ((float)connConfig.numberOfConnections)/groupConfigMap[connConfig.grpSrc].numN;
175  float avgPreM = ((float)connConfig.numberOfConnections)/groupConfigMap[connConfig.grpDest].numN;
176  KERNEL_INFO(" - Avg numPreSynapses = %8.2f", avgPreM );
177  KERNEL_INFO(" - Avg numPostSynapses = %8.2f", avgPostM );
178 }
179 
180 // print connection info, akin to printGroupInfo
181 void SNN::printConnectionInfo(int netId, std::list<ConnectConfig>::iterator connIt) {
182 
183  KERNEL_INFO(" |-+ %s Connection Id %d: %s(%d) => %s(%d)", netId == groupConfigMDMap[connIt->grpDest].netId ? "Local" : "External", connIt->connId,
184  groupConfigMap[connIt->grpSrc].grpName.c_str(), connIt->grpSrc,
185  groupConfigMap[connIt->grpDest].grpName.c_str(), connIt->grpDest);
186  KERNEL_INFO(" |- Type = %s", GET_FIXED_PLASTIC(connIt->connProp)==SYN_PLASTIC?" PLASTIC":" FIXED")
187  KERNEL_INFO(" |- Min weight = %8.5f", 0.0f); // \TODO
188  KERNEL_INFO(" |- Max weight = %8.5f", fabs(connIt->maxWt));
189  KERNEL_INFO(" |- Initial weight = %8.5f", fabs(connIt->initWt));
190  KERNEL_INFO(" |- Min delay = %8d", connIt->minDelay);
191  KERNEL_INFO(" |- Max delay = %8d", connIt->maxDelay);
192  KERNEL_INFO(" |- Radius X = %8.2f", connIt->connRadius.radX);
193  KERNEL_INFO(" |- Radius Y = %8.2f", connIt->connRadius.radY);
194  KERNEL_INFO(" |- Radius Z = %8.2f", connIt->connRadius.radZ);
195  KERNEL_INFO(" |- Num of synapses = %d", connIt->numberOfConnections);
196  float avgPostM = ((float)connIt->numberOfConnections)/groupConfigMap[connIt->grpSrc].numN;
197  float avgPreM = ((float)connIt->numberOfConnections)/groupConfigMap[connIt->grpDest].numN;
198  KERNEL_INFO(" |- Avg numPreSynapses = %8.2f", avgPreM );
199  KERNEL_INFO(" |- Avg numPostSynapses = %8.2f", avgPostM );
200 }
201 
202 void SNN::printGroupInfo(int gGrpId) {
203  KERNEL_INFO("Group %s(%d): ", groupConfigMap[gGrpId].grpName.c_str(), gGrpId);
204  KERNEL_INFO(" - Type = %s", isExcitatoryGroup(gGrpId) ? " EXCIT" :
205  (isInhibitoryGroup(gGrpId) ? " INHIB" : (isPoissonGroup(gGrpId)?" POISSON" :
206  (isDopaminergicGroup(gGrpId) ? " DOPAM" : " UNKNOWN"))) );
207  KERNEL_INFO(" - Size = %8d", groupConfigMap[gGrpId].numN);
208  KERNEL_INFO(" - Start Id = %8d", groupConfigMDMap[gGrpId].gStartN);
209  KERNEL_INFO(" - End Id = %8d", groupConfigMDMap[gGrpId].gEndN);
210  KERNEL_INFO(" - numPostSynapses = %8d", groupConfigMDMap[gGrpId].numPostSynapses);
211  KERNEL_INFO(" - numPreSynapses = %8d", groupConfigMDMap[gGrpId].numPreSynapses);
212 
213  if (snnState == EXECUTABLE_SNN) {
214  KERNEL_INFO(" - Avg post connections = %8.5f", ((float)groupConfigMDMap[gGrpId].numPostSynapses)/groupConfigMap[gGrpId].numN);
215  KERNEL_INFO(" - Avg pre connections = %8.5f", ((float)groupConfigMDMap[gGrpId].numPreSynapses )/groupConfigMap[gGrpId].numN);
216  }
217 
218  if(groupConfigMap[gGrpId].type & POISSON_NEURON) {
219  KERNEL_INFO(" - Refractory period = %8.5f", groupConfigMDMap[gGrpId].refractPeriod);
220  }
221 
222  if (groupConfigMap[gGrpId].stpConfig.WithSTP) {
223  KERNEL_INFO(" - STP:");
224  KERNEL_INFO(" - STP_A = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_A);
225  KERNEL_INFO(" - STP_U = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_U);
226  KERNEL_INFO(" - STP_tau_u = %8d", (int) (1.0f/groupConfigMap[gGrpId].stpConfig.STP_tau_u_inv));
227  KERNEL_INFO(" - STP_tau_x = %8d", (int) (1.0f/groupConfigMap[gGrpId].stpConfig.STP_tau_x_inv));
228  }
229 
230  if(groupConfigMap[gGrpId].stdpConfig.WithSTDP) {
231  KERNEL_INFO(" - STDP:")
232  KERNEL_INFO(" - E-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == STANDARD ? "STANDARD" :
233  (groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
234  KERNEL_INFO(" - I-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == STANDARD ? "STANDARD" :
235  (groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == DA_MOD?" DA_MOD":" UNKNOWN"));
236  KERNEL_INFO(" - ALPHA_PLUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_PLUS_EXC);
237  KERNEL_INFO(" - ALPHA_MINUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_MINUS_EXC);
238  KERNEL_INFO(" - TAU_PLUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_PLUS_INV_EXC);
239  KERNEL_INFO(" - TAU_MINUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_MINUS_INV_EXC);
240  KERNEL_INFO(" - BETA_LTP = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTP);
241  KERNEL_INFO(" - BETA_LTD = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTD);
242  KERNEL_INFO(" - LAMBDA = %8.5f", groupConfigMap[gGrpId].stdpConfig.LAMBDA);
243  KERNEL_INFO(" - DELTA = %8.5f", groupConfigMap[gGrpId].stdpConfig.DELTA);
244  }
245 }
246 
247 void SNN::printGroupInfo(int netId, std::list<GroupConfigMD>::iterator grpIt) {
248  int gGrpId = grpIt->gGrpId;
249  KERNEL_INFO(" |-+ %s Group %s(G:%d,L:%d): ", netId == grpIt->netId ? "Local" : "External", groupConfigMap[grpIt->gGrpId].grpName.c_str(), grpIt->gGrpId, grpIt->lGrpId);
250  KERNEL_INFO(" |- Type = %s", isExcitatoryGroup(grpIt->gGrpId) ? " EXCIT" :
251  (isInhibitoryGroup(grpIt->gGrpId) ? " INHIB" : (isPoissonGroup(grpIt->gGrpId)?" POISSON" :
252  (isDopaminergicGroup(grpIt->gGrpId) ? " DOPAM" : " UNKNOWN"))) );
253  KERNEL_INFO(" |- Num of Neurons = %8d", groupConfigMap[grpIt->gGrpId].numN);
254  KERNEL_INFO(" |- Start Id = (G:%d,L:%d)", grpIt->gStartN, grpIt->lStartN);
255  KERNEL_INFO(" |- End Id = (G:%d,L:%d)", grpIt->gEndN, grpIt->lEndN);
256  KERNEL_INFO(" |- numPostSynapses = %8d", grpIt->numPostSynapses);
257  KERNEL_INFO(" |- numPreSynapses = %8d", grpIt->numPreSynapses);
258 
259  if (snnState == EXECUTABLE_SNN) {
260  KERNEL_INFO(" |- Avg post connections = %8.5f", ((float)grpIt->numPostSynapses) / groupConfigMap[gGrpId].numN);
261  KERNEL_INFO(" |- Avg pre connections = %8.5f", ((float)grpIt->numPreSynapses) / groupConfigMap[gGrpId].numN);
262  }
263 
264  if (groupConfigMap[gGrpId].type & POISSON_NEURON) {
265  KERNEL_INFO(" |- Refractory period = %8.5f", grpIt->refractPeriod);
266  }
267 
268  if (groupConfigMap[gGrpId].stpConfig.WithSTP) {
269  KERNEL_INFO(" |-+ STP:");
270  KERNEL_INFO(" |- STP_A = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_A);
271  KERNEL_INFO(" |- STP_U = %8.5f", groupConfigMap[gGrpId].stpConfig.STP_U);
272  KERNEL_INFO(" |- STP_tau_u = %8d", (int)(1.0f / groupConfigMap[gGrpId].stpConfig.STP_tau_u_inv));
273  KERNEL_INFO(" |- STP_tau_x = %8d", (int)(1.0f / groupConfigMap[gGrpId].stpConfig.STP_tau_x_inv));
274  }
275 
276  if (groupConfigMap[gGrpId].stdpConfig.WithSTDP) {
277  KERNEL_INFO(" |-+ STDP:")
278  KERNEL_INFO(" |- E-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == STANDARD ? "STANDARD" :
279  (groupConfigMap[gGrpId].stdpConfig.WithESTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
280  KERNEL_INFO(" |- I-STDP TYPE = %s", groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == STANDARD ? "STANDARD" :
281  (groupConfigMap[gGrpId].stdpConfig.WithISTDPtype == DA_MOD ? " DA_MOD" : " UNKNOWN"));
282  KERNEL_INFO(" |- ALPHA_PLUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_PLUS_EXC);
283  KERNEL_INFO(" |- ALPHA_MINUS_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.ALPHA_MINUS_EXC);
284  KERNEL_INFO(" |- TAU_PLUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_PLUS_INV_EXC);
285  KERNEL_INFO(" |- TAU_MINUS_INV_EXC = %8.5f", groupConfigMap[gGrpId].stdpConfig.TAU_MINUS_INV_EXC);
286  KERNEL_INFO(" |- BETA_LTP = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTP);
287  KERNEL_INFO(" |- BETA_LTD = %8.5f", groupConfigMap[gGrpId].stdpConfig.BETA_LTD);
288  KERNEL_INFO(" |- LAMBDA = %8.5f", groupConfigMap[gGrpId].stdpConfig.LAMBDA);
289  KERNEL_INFO(" |- DELTA = %8.5f", groupConfigMap[gGrpId].stdpConfig.DELTA);
290  }
291 }
292 
293 void SNN::printSikeRoutingInfo() {
294  if (!spikeRoutingTable.empty()) {
295  KERNEL_INFO("***************** Spike Routing Table *************************");
296  for (std::list<RoutingTableEntry>::iterator rteItr = spikeRoutingTable.begin(); rteItr != spikeRoutingTable.end(); rteItr++)
297  KERNEL_INFO(" |-Source net:[%d] -> Destination net[%d]", rteItr->srcNetId, rteItr->destNetId);
298  }
299 }
300 
POISSON_NEURON
#define POISSON_NEURON
Definition: carlsim_definitions.h:65
connection_monitor_core.h
ConnectConfig_s::initWt
float initWt
Definition: snn_datastructures.h:125
RadiusRF::radX
double radX
Definition: carlsim_datastructures.h:372
ConnectConfig_s::grpSrc
int grpSrc
Definition: snn_datastructures.h:120
group_monitor_core.h
GroupMonitorCore::getPeakTimeVector
std::vector< int > getPeakTimeVector()
get the timestamps for peak values
Definition: group_monitor_core.cpp:125
ConnectionMonitorCore::printSparse
void printSparse(int neurPostId=ALL, int maxConn=100, int connPerLine=4, bool storeNewSnapshot=true)
Definition: connection_monitor_core.cpp:341
STDP
#define STDP(t, a, b)
Definition: snn_definitions.h:149
ConnectConfig_s::maxDelay
uint8_t maxDelay
Definition: snn_datastructures.h:122
ConnectConfig_s::grpDest
int grpDest
Definition: snn_datastructures.h:121
SNN::isPoissonGroup
bool isPoissonGroup(int gGrpId)
Definition: snn.h:622
ALL
#define ALL
CARLsim common definitions.
Definition: carlsim_definitions.h:55
ConnectConfig_s::minDelay
uint8_t minDelay
Definition: snn_datastructures.h:123
KERNEL_INFO
#define KERNEL_INFO(formatc,...)
Definition: snn_definitions.h:113
ConnectConfig_s::connProp
uint32_t connProp
Definition: snn_datastructures.h:131
DA_MOD
@ DA_MOD
dopamine-modulated STDP, nearest-neighbor
Definition: carlsim_datastructures.h:162
SYN_PLASTIC
#define SYN_PLASTIC
Definition: carlsim_definitions.h:60
GET_FIXED_PLASTIC
#define GET_FIXED_PLASTIC(a)
Definition: snn_definitions.h:207
EXECUTABLE_SNN
@ EXECUTABLE_SNN
Definition: snn_datastructures.h:81
ConnectConfig_s
The configuration of a connection.
Definition: snn_datastructures.h:119
RadiusRF::radY
double radY
Definition: carlsim_datastructures.h:372
STANDARD
@ STANDARD
standard STDP of Bi & Poo (2001), nearest-neighbor
Definition: carlsim_datastructures.h:161
SNN::isInhibitoryGroup
bool isInhibitoryGroup(int gGrpId)
Definition: snn.h:621
ConnectConfig_s::maxWt
float maxWt
Definition: snn_datastructures.h:124
snn.h
SNN
Contains all of CARLsim's core functionality.
Definition: snn.h:114
ConnectConfig_s::numberOfConnections
int numberOfConnections
Definition: snn_datastructures.h:136
RuntimeData_s::nSpikeCnt
int * nSpikeCnt
homeostatic plasticity variables
Definition: snn_datastructures.h:561
SNN::isExcitatoryGroup
bool isExcitatoryGroup(int gGrpId)
Definition: snn.h:620
SNN::getConnectId
short int getConnectId(int grpIdPre, int grpIdPost)
find connection ID based on pre-post group pair, O(N)
Definition: snn_manager.cpp:1703
GroupConfigMD_s
Definition: snn_datastructures.h:328
SNN::isDopaminergicGroup
bool isDopaminergicGroup(int gGrpId)
Definition: snn.h:623
RadiusRF::radZ
double radZ
Definition: carlsim_datastructures.h:372
ConnectConfig_s::connRadius
RadiusRF connRadius
Definition: snn_datastructures.h:127