GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
models.h
Go to the documentation of this file.
1 #pragma once
2 
3 // Standard C++ includes
4 #include <string>
5 #include <vector>
6 
7 // GeNN includes
8 #include "snippet.h"
9 #include "initVarSnippet.h"
10 
11 //----------------------------------------------------------------------------
12 // Macros
13 //----------------------------------------------------------------------------
14 #define DECLARE_MODEL(TYPE, NUM_PARAMS, NUM_VARS) \
15  DECLARE_SNIPPET(TYPE, NUM_PARAMS); \
16  typedef Models::VarInitContainerBase<NUM_VARS> VarValues; \
17  typedef Models::VarInitContainerBase<0> PreVarValues; \
18  typedef Models::VarInitContainerBase<0> PostVarValues
19 
20 #define IMPLEMENT_MODEL(TYPE) IMPLEMENT_SNIPPET(TYPE)
21 
22 #define SET_VARS(...) virtual VarVec getVars() const override{ return __VA_ARGS__; }
23 #define SET_EXTRA_GLOBAL_PARAMS(...) virtual VarVec getExtraGlobalParams() const override{ return __VA_ARGS__; }
24 
25 //----------------------------------------------------------------------------
26 // Models::VarInit
27 //----------------------------------------------------------------------------
28 namespace Models
29 {
33 class VarInit : public Snippet::Init<InitVarSnippet::Base>
34 {
35 public:
36  VarInit(const InitVarSnippet::Base *snippet, const std::vector<double> &params)
37  : Snippet::Init<InitVarSnippet::Base>(snippet, params)
38  {
39  }
40 
41  VarInit(double constant)
42  : Snippet::Init<InitVarSnippet::Base>(InitVarSnippet::Constant::getInstance(), {constant})
43  {
44  }
45 };
46 
47 //----------------------------------------------------------------------------
48 // Models::VarInitContainerBase
49 //----------------------------------------------------------------------------
52 template<size_t NumVars>
54 {
55 private:
56  //----------------------------------------------------------------------------
57  // Typedefines
58  //----------------------------------------------------------------------------
59  typedef std::vector<VarInit> InitialiserArray;
60 
61 public:
62  // **NOTE** other less terrifying forms of constructor won't complain at compile time about
63  // number of parameters e.g. std::array<VarInit, 4> can be initialized with <= 4 elements
64  template<typename... T>
65  VarInitContainerBase(T&&... initialisers) : m_Initialisers(InitialiserArray{{std::forward<const VarInit>(initialisers)...}})
66  {
67  static_assert(sizeof...(initialisers) == NumVars, "Wrong number of initialisers");
68  }
69 
70  //----------------------------------------------------------------------------
71  // Public API
72  //----------------------------------------------------------------------------
74  const std::vector<VarInit> &getInitialisers() const
75  {
76  return m_Initialisers;
77  }
78 
79  //----------------------------------------------------------------------------
80  // Operators
81  //----------------------------------------------------------------------------
82  const VarInit &operator[](size_t pos) const
83  {
84  return m_Initialisers[pos];
85  }
86 
87 private:
88  //----------------------------------------------------------------------------
89  // Members
90  //----------------------------------------------------------------------------
91  InitialiserArray m_Initialisers;
92 };
93 
94 //----------------------------------------------------------------------------
95 // Models::VarInitContainerBase<0>
96 //----------------------------------------------------------------------------
99 template<>
101 {
102 public:
103  // **NOTE** other less terrifying forms of constructor won't complain at compile time about
104  // number of parameters e.g. std::array<VarInit, 4> can be initialized with <= 4 elements
105  template<typename... T>
106  VarInitContainerBase(T&&... initialisers)
107  {
108  static_assert(sizeof...(initialisers) == 0, "Wrong number of initialisers");
109  }
110 
112  {
113  }
114 
115  //----------------------------------------------------------------------------
116  // Public API
117  //----------------------------------------------------------------------------
119  std::vector<VarInit> getInitialisers() const
120  {
121  return {};
122  }
123 };
124 
125 //----------------------------------------------------------------------------
126 // Models::Base
127 //----------------------------------------------------------------------------
129 class Base : public Snippet::Base
130 {
131 public:
132  //----------------------------------------------------------------------------
133  // Declared virtuals
134  //------------------------------------------------------------------------
136  virtual VarVec getVars() const{ return {}; }
137 
140  virtual VarVec getExtraGlobalParams() const{ return {}; }
141 
142  //------------------------------------------------------------------------
143  // Public methods
144  //------------------------------------------------------------------------
146  size_t getVarIndex(const std::string &varName) const
147  {
148  return getVarVecIndex(varName, getVars());
149  }
150 
152  size_t getExtraGlobalParamIndex(const std::string &paramName) const
153  {
154  return getVarVecIndex(paramName, getExtraGlobalParams());
155  }
156 };
157 } // Models
size_t getExtraGlobalParamIndex(const std::string &paramName) const
Find the index of a named extra global parameter.
Definition: models.h:152
VarInit(const InitVarSnippet::Base *snippet, const std::vector< double > &params)
Definition: models.h:36
Base class for all models - in addition to the parameters snippets have, models can have state variab...
Definition: models.h:129
Definition: snippet.h:185
Init(const InitVarSnippet::Base *snippet, const std::vector< double > &params)
Definition: snippet.h:188
Definition: snippet.h:87
virtual VarVec getExtraGlobalParams() const
Definition: models.h:140
VarInit(double constant)
Definition: models.h:41
VarInitContainerBase(T &&... initialisers)
Definition: models.h:65
VarInitContainerBase(T &&... initialisers)
Definition: models.h:106
const std::vector< VarInit > & getInitialisers() const
Gets initialisers as a vector of Values.
Definition: models.h:74
const VarInit & operator[](size_t pos) const
Definition: models.h:82
Definition: models.h:33
Definition: initVarSnippet.h:17
virtual VarVec getVars() const
Gets names and types (as strings) of model variables.
Definition: models.h:136
size_t getVarIndex(const std::string &varName) const
Find the index of a named variable.
Definition: models.h:146
VarInitContainerBase(const Snippet::ValueBase< 0 > &)
Definition: models.h:111
Base class for all value initialisation snippets.
Definition: initVarSnippet.h:15
std::vector< Var > VarVec
Definition: snippet.h:148
Base class for all code snippets.
Definition: snippet.h:112
Definition: models.h:28
std::vector< VarInit > getInitialisers() const
Gets initialisers as a vector of Values.
Definition: models.h:119
Definition: models.h:53
Definition: snippet.h:43