GeNN  4.9.0
GPU enhanced Neuronal Networks (GeNN)
initGroupMerged.h
Go to the documentation of this file.
1 #pragma once
2 
3 // GeNN code generator includes
5 
6 //----------------------------------------------------------------------------
7 // CodeGenerator::NeuronInitGroupMerged
8 //----------------------------------------------------------------------------
9 namespace CodeGenerator
10 {
12 {
13 public:
14  NeuronInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend,
15  const std::vector<std::reference_wrapper<const NeuronGroupInternal>> &groups);
16 
17  //----------------------------------------------------------------------------
18  // Public API
19  //----------------------------------------------------------------------------
21  bool isInSynWUMVarInitParamHeterogeneous(size_t childIndex, size_t varIndex, size_t paramIndex) const;
22 
24  bool isInSynWUMVarInitDerivedParamHeterogeneous(size_t childIndex, size_t varIndex, size_t paramIndex) const;
25 
27  bool isOutSynWUMVarInitParamHeterogeneous(size_t childIndex, size_t varIndex, size_t paramIndex) const;
28 
30  bool isOutSynWUMVarInitDerivedParamHeterogeneous(size_t childIndex, size_t varIndex, size_t paramIndex) const;
31 
33  const std::vector<SynapseGroupInternal*> &getSortedArchetypeInSynWithPostVars() const { return m_SortedInSynWithPostVars.front(); }
34 
36  const std::vector<SynapseGroupInternal*> &getSortedArchetypeOutSynWithPreVars() const { return m_SortedOutSynWithPreVars.front(); }
37 
39  boost::uuids::detail::sha1::digest_type getHashDigest() const;
40 
41  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
42  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
43  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
44  {
45  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
46  runnerVarDecl, runnerMergedStructAlloc, name);
47  }
48 
49  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
50 
51  //----------------------------------------------------------------------------
52  // Static constants
53  //----------------------------------------------------------------------------
54  static const std::string name;
55 
56 private:
57  //------------------------------------------------------------------------
58  // Private methods
59  //------------------------------------------------------------------------
61  void generateWUVar(const BackendBase &backend, const std::string &fieldPrefixStem,
62  const std::vector<std::vector<SynapseGroupInternal *>> &sortedSyn,
63  Models::Base::VarVec(WeightUpdateModels::Base::*getVars)(void) const,
64  const std::vector<Models::VarInit>&(SynapseGroupInternal::*getVarInitialiserFn)(void) const,
65  bool(NeuronInitGroupMerged::*isParamHeterogeneousFn)(size_t, size_t, size_t) const,
66  bool(NeuronInitGroupMerged::*isDerivedParamHeterogeneousFn)(size_t, size_t, size_t) const,
67  const std::string&(SynapseGroupInternal::*getFusedVarSuffix)(void) const);
68 
70  bool isInSynWUMVarInitParamReferenced(size_t childIndex, size_t varIndex, size_t paramIndex) const;
71 
73  bool isInSynWUMVarInitDerivedParamReferenced(size_t childIndex, size_t varIndex, size_t paramIndex) const;
74 
76  bool isOutSynWUMVarInitParamReferenced(size_t childIndex, size_t varIndex, size_t paramIndex) const;
77 
79  bool isOutSynWUMVarInitDerivedParamReferenced(size_t childIndex, size_t varIndex, size_t paramIndex) const;
80 
81  void genInitSpikeCount(CodeStream &os, const BackendBase &backend, const Substitutions &popSubs,
82  bool spikeEvent, unsigned int batchSize) const;
83 
84  void genInitSpikes(CodeStream &os, const BackendBase &backend, const Substitutions &popSubs,
85  bool spikeEvent, unsigned int batchSize) const;
86 
87  void genInitSpikeTime(CodeStream &os, const BackendBase &backend, const Substitutions &popSubs,
88  const std::string &varName, unsigned int batchSize) const;
89  //------------------------------------------------------------------------
90  // Members
91  //------------------------------------------------------------------------
92  std::vector<std::vector<SynapseGroupInternal *>> m_SortedInSynWithPostVars;
93  std::vector<std::vector<SynapseGroupInternal *>> m_SortedOutSynWithPreVars;
94 };
95 
96 
97 //----------------------------------------------------------------------------
98 // CodeGenerator::SynapseInitGroupMerged
99 //----------------------------------------------------------------------------
101 {
102 public:
103  SynapseInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend,
104  const std::vector<std::reference_wrapper<const SynapseGroupInternal>> &groups)
105  : SynapseGroupMergedBase(index, precision, timePrecision, backend, SynapseGroupMergedBase::Role::Init, "", groups)
106  {}
107 
108  boost::uuids::detail::sha1::digest_type getHashDigest() const
109  {
111  }
112 
113  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
114  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
115  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
116  {
117  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
118  runnerVarDecl, runnerMergedStructAlloc, name);
119  }
120 
121  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
122 
123  //----------------------------------------------------------------------------
124  // Static constants
125  //----------------------------------------------------------------------------
126  static const std::string name;
127 };
128 
129 //----------------------------------------------------------------------------
130 // CodeGenerator::SynapseSparseInitGroupMerged
131 //----------------------------------------------------------------------------
133 {
134 public:
135  SynapseSparseInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend,
136  const std::vector<std::reference_wrapper<const SynapseGroupInternal>> &groups)
137  : SynapseGroupMergedBase(index, precision, timePrecision, backend, SynapseGroupMergedBase::Role::SparseInit, "", groups)
138  {}
139 
140  boost::uuids::detail::sha1::digest_type getHashDigest() const
141  {
143  }
144 
145  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
146  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
147  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
148  {
149  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
150  runnerVarDecl, runnerMergedStructAlloc, name);
151  }
152 
153  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
154 
155  //----------------------------------------------------------------------------
156  // Static constants
157  //----------------------------------------------------------------------------
158  static const std::string name;
159 };
160 
161 // ----------------------------------------------------------------------------
162 // CodeGenerator::SynapseConnectivityInitGroupMerged
163 //----------------------------------------------------------------------------
165 {
166 public:
167  SynapseConnectivityInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend,
168  const std::vector<std::reference_wrapper<const SynapseGroupInternal>> &groups)
169  : SynapseGroupMergedBase(index, precision, timePrecision, backend, SynapseGroupMergedBase::Role::ConnectivityInit, "", groups)
170  {}
171 
172  boost::uuids::detail::sha1::digest_type getHashDigest() const
173  {
175  }
176 
177  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
178  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
179  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
180  {
181  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
182  runnerVarDecl, runnerMergedStructAlloc, name);
183  }
184 
185  void generateSparseRowInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
186  void generateSparseColumnInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
187  void generateKernelInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
188 
189  //----------------------------------------------------------------------------
190  // Static constants
191  //----------------------------------------------------------------------------
192  static const std::string name;
193 
194 private:
195  //----------------------------------------------------------------------------
196  // Private methods
197  //----------------------------------------------------------------------------
199  void genInitConnectivity(CodeStream &os, Substitutions &popSubs, const std::string &ftype, bool rowNotColumns) const;
200 };
201 
202 //----------------------------------------------------------------------------
203 // CodeGenerator::CustomUpdateInitGroupMergedBase
204 //----------------------------------------------------------------------------
205 template<typename G>
207 {
208 public:
209  //----------------------------------------------------------------------------
210  // Public API
211  //----------------------------------------------------------------------------
213  bool isVarInitParamHeterogeneous(size_t varIndex, size_t paramIndex) const
214  {
215  return (isVarInitParamReferenced(varIndex, paramIndex) &&
216  this->isParamValueHeterogeneous(paramIndex, [varIndex](const G &cg) { return cg.getVarInitialisers().at(varIndex).getParams(); }));
217  }
218 
220  bool isVarInitDerivedParamHeterogeneous(size_t varIndex, size_t paramIndex) const
221  {
222  return (isVarInitDerivedParamReferenced(varIndex, paramIndex) &&
223  this->isParamValueHeterogeneous(paramIndex, [varIndex](const G &cg) { return cg.getVarInitialisers().at(varIndex).getDerivedParams(); }));
224  }
225 
226 protected:
227  CustomUpdateInitGroupMergedBase(size_t index, const std::string &precision, const BackendBase &backend,
228  const std::vector<std::reference_wrapper<const G>> &groups)
229  : GroupMerged<G>(index, precision, groups)
230  {
231  // Loop through variables
232  const CustomUpdateModels::Base *cm = this->getArchetype().getCustomUpdateModel();
233  const auto vars = cm->getVars();
234  const auto &varInit = this->getArchetype().getVarInitialisers();
235  assert(vars.size() == varInit.size());
236  for(size_t v = 0; v < vars.size(); v++) {
237  // If we're not initialising or if there is initialization code for this variable
238  const auto var = vars[v];
239  if(!varInit[v].getSnippet()->getCode().empty()) {
240  this->addPointerField(var.type, var.name, backend.getDeviceVarPrefix() + var.name);
241  }
242 
243  // Add any var init EGPs to structure
244  this->addEGPs(varInit[v].getSnippet()->getExtraGlobalParams(), backend.getDeviceVarPrefix(), var.name);
245  }
246 
247  this->template addHeterogeneousVarInitParams<CustomUpdateInitGroupMergedBase<G>>(
248  vars, &G::getVarInitialisers,
250 
251  this->template addHeterogeneousVarInitDerivedParams<CustomUpdateInitGroupMergedBase<G>>(
252  vars, &G::getVarInitialisers,
254  }
255 
256  //----------------------------------------------------------------------------
257  // Protected methods
258  //----------------------------------------------------------------------------
259  void updateBaseHash(boost::uuids::detail::sha1 &hash) const
260  {
261  // Update hash with archetype's hash digest
262  Utils::updateHash(this->getArchetype().getInitHashDigest(), hash);
263 
264  // Update hash with each group's variable initialisation parameters and derived parameters
265  this->template updateVarInitParamHash<CustomUpdateInitGroupMergedBase<G>>(
267 
268  this->template updateVarInitDerivedParamHash<CustomUpdateInitGroupMergedBase<G>>(
270  }
271 
272 private:
273  //----------------------------------------------------------------------------
274  // Private methods
275  //----------------------------------------------------------------------------
277  bool isVarInitParamReferenced(size_t varIndex, size_t paramIndex) const
278  {
279  // If parameter isn't referenced in code, there's no point implementing it hetereogeneously!
280  const auto *varInitSnippet = this->getArchetype().getVarInitialisers().at(varIndex).getSnippet();
281  const std::string paramName = varInitSnippet->getParamNames().at(paramIndex);
282  return this->isParamReferenced({varInitSnippet->getCode()}, paramName);
283  }
284 
286  bool isVarInitDerivedParamReferenced(size_t varIndex, size_t paramIndex) const
287  {
288  // If parameter isn't referenced in code, there's no point implementing it hetereogeneously!
289  const auto *varInitSnippet = this->getArchetype().getVarInitialisers().at(varIndex).getSnippet();
290  const std::string derivedParamName = varInitSnippet->getDerivedParams().at(paramIndex).name;
291  return this->isParamReferenced({varInitSnippet->getCode()}, derivedParamName);
292  }
293 };
294 
295 // ----------------------------------------------------------------------------
296 // CodeGenerator::CustomUpdateInitGroupMerged
297 //----------------------------------------------------------------------------
299 {
300 public:
301  CustomUpdateInitGroupMerged(size_t index, const std::string &precision, const std::string &, const BackendBase &backend,
302  const std::vector<std::reference_wrapper<const CustomUpdateInternal>> &groups);
303 
304  //----------------------------------------------------------------------------
305  // Public API
306  //----------------------------------------------------------------------------
307  boost::uuids::detail::sha1::digest_type getHashDigest() const;
308 
309  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
310  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
311  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
312  {
313  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
314  runnerVarDecl, runnerMergedStructAlloc, name);
315  }
316 
317  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
318 
319  //----------------------------------------------------------------------------
320  // Static constants
321  //----------------------------------------------------------------------------
322  static const std::string name;
323 };
324 
325 
326 // ----------------------------------------------------------------------------
327 // CodeGenerator::CustomWUUpdateInitGroupMerged
328 //----------------------------------------------------------------------------
330 {
331 public:
332  CustomWUUpdateInitGroupMerged(size_t index, const std::string &precision, const std::string &, const BackendBase &backend,
333  const std::vector<std::reference_wrapper<const CustomUpdateWUInternal>> &groups);
334 
335  //----------------------------------------------------------------------------
336  // Public API
337  //----------------------------------------------------------------------------
338  boost::uuids::detail::sha1::digest_type getHashDigest() const;
339 
340  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
341  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
342  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
343  {
344  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
345  runnerVarDecl, runnerMergedStructAlloc, name);
346  }
347 
348  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
349 
351  bool isKernelSizeHeterogeneous(size_t dimensionIndex) const
352  {
353  return CodeGenerator::isKernelSizeHeterogeneous(this, dimensionIndex, getGroupKernelSize);
354  }
355 
357  std::string getKernelSize(size_t dimensionIndex) const
358  {
359  return CodeGenerator::getKernelSize(this, dimensionIndex, getGroupKernelSize);
360  }
361 
363  void genKernelIndex(std::ostream &os, const CodeGenerator::Substitutions &subs) const
364  {
365  return CodeGenerator::genKernelIndex(this, os, subs, getGroupKernelSize);
366  }
367 
368  //----------------------------------------------------------------------------
369  // Static constants
370  //----------------------------------------------------------------------------
371  static const std::string name;
372 
373 private:
374  //----------------------------------------------------------------------------
375  // Private static methods
376  //----------------------------------------------------------------------------
377  static const std::vector<unsigned int> &getGroupKernelSize(const CustomUpdateWUInternal &g)
378  {
379  return g.getSynapseGroup()->getKernelSize();
380  }
381 };
382 
383 // ----------------------------------------------------------------------------
384 // CodeGenerator::CustomWUUpdateSparseInitGroupMerged
385 //----------------------------------------------------------------------------
387 {
388 public:
389  CustomWUUpdateSparseInitGroupMerged(size_t index, const std::string &precision, const std::string &, const BackendBase &backend,
390  const std::vector<std::reference_wrapper<const CustomUpdateWUInternal>> &groups);
391 
392  //----------------------------------------------------------------------------
393  // Public API
394  //----------------------------------------------------------------------------
395  boost::uuids::detail::sha1::digest_type getHashDigest() const;
396 
397  void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal,
398  CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar,
399  CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
400  {
401  generateRunnerBase(backend, definitionsInternal, definitionsInternalFunc, definitionsInternalVar,
402  runnerVarDecl, runnerMergedStructAlloc, name);
403  }
404 
405  void generateInit(const BackendBase &backend, CodeStream &os, const ModelSpecMerged &modelMerged, Substitutions &popSubs) const;
406 
407  //----------------------------------------------------------------------------
408  // Static constants
409  //----------------------------------------------------------------------------
410  static const std::string name;
411 };
412 } // namespace CodeGenerator
void genKernelIndex(std::ostream &os, const CodeGenerator::Substitutions &subs) const
Generate an index into a kernel based on the id_kernel_XXX variables in subs.
Definition: initGroupMerged.h:363
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:177
bool isKernelSizeHeterogeneous(size_t dimensionIndex) const
Is kernel size heterogeneous in this dimension?
Definition: initGroupMerged.h:351
static const std::string name
Definition: initGroupMerged.h:371
Definition: initGroupMerged.h:298
boost::uuids::detail::sha1::digest_type getHashDigest(Role role) const
Definition: groupMerged.cc:1188
std::vector< Var > VarVec
Definition: models.h:115
Definition: groupMerged.h:1021
std::string getKernelSize(size_t dimensionIndex) const
Get expression for kernel size in dimension (may be literal or group->kernelSizeXXX) ...
Definition: initGroupMerged.h:357
Definition: initGroupMerged.h:206
static const std::string name
Definition: initGroupMerged.h:192
void genKernelIndex(const G *group, std::ostream &os, const CodeGenerator::Substitutions &subs, K getKernelSizeFn)
Definition: codeGenUtils.h:180
#define GENN_EXPORT
Definition: gennExport.h:13
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:113
boost::uuids::detail::sha1::digest_type getHashDigest() const
Definition: initGroupMerged.h:108
bool isVarInitDerivedParamHeterogeneous(size_t varIndex, size_t paramIndex) const
Should the var init derived parameter be implemented heterogeneously?
Definition: initGroupMerged.h:220
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:41
GENN_EXPORT void generateInit(const filesystem::path &outputPath, const ModelSpecMerged &modelMerged, const BackendBase &backend, const std::string &suffix="")
Definition: generateModules.cc:268
Definition: modelSpecMerged.h:31
Helper class for generating code - automatically inserts brackets, indents etc.
Definition: backendBase.h:30
Base class for all current source models.
Definition: customUpdateModels.h:31
boost::uuids::detail::sha1::digest_type getHashDigest() const
Definition: initGroupMerged.h:172
Definition: groupMerged.h:33
Definition: synapseGroupInternal.h:9
Definition: codeStream.h:21
const SynapseGroupInternal * getSynapseGroup() const
Definition: customUpdate.h:278
Definition: substitutions.h:21
Base class for all weight update models.
Definition: weightUpdateModels.h:46
static const std::string name
Definition: initGroupMerged.h:126
Definition: initGroupMerged.h:132
const std::vector< unsigned int > & getKernelSize() const
Definition: synapseGroup.h:130
void updateHash(const T &value, boost::uuids::detail::sha1 &hash)
Hash arithmetic types and enums.
Definition: gennUtils.h:128
Definition: initGroupMerged.h:11
Definition: backendBase.h:176
void updateBaseHash(boost::uuids::detail::sha1 &hash) const
Definition: initGroupMerged.h:259
boost::uuids::detail::sha1::digest_type getHashDigest() const
Definition: initGroupMerged.h:140
static const std::string name
Definition: initGroupMerged.h:410
Definition: initGroupMerged.h:329
static const std::string name
Definition: initGroupMerged.h:54
bool isVarInitParamHeterogeneous(size_t varIndex, size_t paramIndex) const
Should the var init parameter be implemented heterogeneously?
Definition: initGroupMerged.h:213
bool isKernelSizeHeterogeneous(const G *group, size_t dimensionIndex, K getKernelSizeFn)
Definition: codeGenUtils.h:152
const std::vector< SynapseGroupInternal * > & getSortedArchetypeInSynWithPostVars() const
Get sorted vectors of incoming synapse groups with postsynaptic variables belonging to archetype grou...
Definition: initGroupMerged.h:33
Definition: groupMerged.h:583
virtual VarVec getVars() const
Gets names and types (as strings) of model variables.
Definition: models.h:123
Definition: customUpdateInternal.h:41
Role
Definition: groupMerged.h:1132
Definition: initGroupMerged.h:164
Definition: initGroupMerged.h:100
const std::vector< SynapseGroupInternal * > & getSortedArchetypeOutSynWithPreVars() const
Get sorted vectors of outgoing synapse groups with presynaptic variables belonging to archetype group...
Definition: initGroupMerged.h:36
std::string getKernelSize(const G *group, size_t dimensionIndex, K getKernelSizeFn)
Definition: codeGenUtils.h:167
static const std::string name
Definition: initGroupMerged.h:322
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:145
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:397
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:340
SynapseSparseInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend, const std::vector< std::reference_wrapper< const SynapseGroupInternal >> &groups)
Definition: initGroupMerged.h:135
SynapseInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend, const std::vector< std::reference_wrapper< const SynapseGroupInternal >> &groups)
Definition: initGroupMerged.h:103
void generateRunner(const BackendBase &backend, CodeStream &definitionsInternal, CodeStream &definitionsInternalFunc, CodeStream &definitionsInternalVar, CodeStream &runnerVarDecl, CodeStream &runnerMergedStructAlloc) const
Definition: initGroupMerged.h:309
SynapseConnectivityInitGroupMerged(size_t index, const std::string &precision, const std::string &timePrecision, const BackendBase &backend, const std::vector< std::reference_wrapper< const SynapseGroupInternal >> &groups)
Definition: initGroupMerged.h:167
virtual std::string getDeviceVarPrefix() const
Definition: backendBase.h:362
CustomUpdateInitGroupMergedBase(size_t index, const std::string &precision, const BackendBase &backend, const std::vector< std::reference_wrapper< const G >> &groups)
Definition: initGroupMerged.h:227
static const std::string name
Definition: initGroupMerged.h:158