Cypress  1.0
C++ Spiking Neural Network Simulation Framework
synapses.hpp
Go to the documentation of this file.
1 /*
2  * Cypress -- C++ Spiking Neural Network Simulation Framework
3  * Copyright (C) 2018 Christoph Ostrau
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #pragma once
20 
21 #ifndef CYPRESS_SYNAPSES_HPP
22 #define CYPRESS_SYNAPSES_HPP
23 
24 #include <algorithm>
25 #include <iostream>
26 #include <memory>
27 #include <string>
28 #include <vector>
29 
30 #include <cypress/core/data.hpp>
32 #include <cypress/core/types.hpp>
34 
39 #define NAMED_PARAMETER(NAME, IDX) \
40  static constexpr size_t idx_##NAME = IDX; \
41  auto &NAME(Real x) \
42  { \
43  m_params[IDX] = x; \
44  return *this; \
45  } \
46  Real NAME() const { return m_params[IDX]; }
47 
48 namespace cypress {
49 
50 namespace {
51 struct SynapseParametersBase {
52  const std::string name;
53  const std::vector<std::string> parameter_names;
54  const std::vector<std::string> parameter_units;
55  std::vector<Real> parameter_defaults;
56  bool learning;
57  SynapseParametersBase(const std::string &name,
58  std::vector<std::string> parameter_names,
59  std::vector<std::string> parameter_units,
60  std::vector<Real> parameter_defaults, bool learning)
61  : name(name),
62  parameter_names(std::move(parameter_names)),
63  parameter_units(std::move(parameter_units)),
64  parameter_defaults(std::move(parameter_defaults)),
65  learning(learning)
66  {
67  }
68 };
69 static const SynapseParametersBase NullSynapse("NULL", {}, {}, {}, false);
70 } // namespace
71 class SynapseBase {
72 protected:
73  std::vector<Real> m_params;
74  bool m_learning = false;
75 
77  {
78  if (m_params.size() != parameter_names().size()) {
80  "Number of parameters in the parameter vector does not match "
81  "the number of parameters of this synapse type");
82  }
83  }
84 
85 public:
86  SynapseBase(std::initializer_list<Real> parameters) : m_params(parameters)
87  {
88  }
89  explicit SynapseBase(std::vector<Real> parameters)
90  : m_params(std::move(parameters))
91  {
92  }
93 
94  // SynapseBase(SynapseBase &synapse) : m_params(synapse.parameters()) {}
95 
99  virtual const std::string name() const { return NullSynapse.name; }
100 
104  virtual const std::vector<std::string> &parameter_names() const
105  {
106  return NullSynapse.parameter_names;
107  }
108 
112  virtual const std::vector<std::string> &parameter_units() const
113  {
114  return NullSynapse.parameter_units;
115  }
116 
120  virtual const std::vector<Real> &parameter_defaults() const
121  {
122  return NullSynapse.parameter_defaults;
123  }
124  virtual bool learning() const { return NullSynapse.learning; }
125 
126  const std::vector<Real> &parameters() const { return m_params; }
127  void parameters(const std::vector<Real> &params)
128  {
129  m_params = params;
130  check_parameter_size();
131  }
132 
136  Optional<size_t> parameter_index(const std::string &name) const
137  {
138  std::vector<std::string> param_names = parameter_names();
139  auto it = std::find(param_names.begin(), param_names.end(), name);
140  if (it != param_names.end()) {
141  return Optional<size_t>(it - param_names.begin());
142  }
143  return Optional<size_t>();
144  }
145 
152  void set(size_t idx, Real value) { m_params[idx] = value; }
153 
158  Real operator[](size_t i) const { return m_params[i]; }
159 
163  const Real *begin() const { return &m_params[0]; }
164 
168  const Real *end() const { return &m_params.back() + 1; }
169 
174  size_t size() const { return m_params.size(); }
175 
185  static std::shared_ptr<SynapseBase> make_shared(SynapseBase &synapse);
186 
187  virtual ~SynapseBase() = default;
188 };
189 
190 namespace {
191 static const SynapseParametersBase StaticSynapseParameters(
192  "StaticSynapse", {"weight", "delay"}, {"microSiemens/nA", "ms"},
193  {0.015, 1.0}, false);
194 static const SynapseParametersBase SpikePairRuleAdditiveParameters(
195  "SpikePairRuleAdditive",
196  {"weight", "delay", "tau_plus", "tau_minus", "A_plus", "A_minus", "w_min",
197  "w_max"},
198  {"microSiemens/nA", "ms", "ms", "ms", "microSiemens/nA", "microSiemens/nA",
199  "microSiemens/nA", "microSiemens/nA"},
200  {0.015, 1.0, 20.0, 20.0, 0.01, 0.01, 0, 0.1}, true);
201 
202 static const SynapseParametersBase TsodyksMarkramMechanismParameters(
203  "TsodyksMarkramMechanism", {"weight", "delay", "U", "tau_rec", "tau_facil"},
204  {"microSiemens/nA", "ms", "", "ms", "ms"}, {0.015, 1.0, 0.0, 100.0, 0.0},
205  false);
206 
207 static const SynapseParametersBase SpikePairRuleMultiplicativeParameters(
208  "SpikePairRuleMultiplicative",
209  {"weight", "delay", "tau_plus", "tau_minus", "A_plus", "A_minus", "w_min",
210  "w_max"},
211  {"microSiemens/nA", "ms", "ms", "ms", "microSiemens/nA", "microSiemens/nA",
212  "microSiemens/nA", "microSiemens/nA"},
213  {0.015, 1.0, 20.0, 20.0, 0.01, 0.01, 0, 0.1}, true);
214 
215 } // namespace
216 
217 class StaticSynapse : public SynapseBase {
218 public:
220  StaticSynapse() : SynapseBase(StaticSynapseParameters.parameter_defaults)
221  {
222  check_parameter_size();
223  }
224  StaticSynapse(const StaticSynapse &synapse)
225  : SynapseBase(synapse.parameters())
226  {
227  check_parameter_size();
228  }
229 
230  const std::string name() const override
231  {
232  return StaticSynapseParameters.name;
233  };
234  const std::vector<std::string> &parameter_names() const override
235  {
236  return StaticSynapseParameters.parameter_names;
237  };
238  const std::vector<std::string> &parameter_units() const override
239  {
240  return StaticSynapseParameters.parameter_units;
241  };
242  const std::vector<Real> &parameter_defaults() const override
243  {
244  return StaticSynapseParameters.parameter_defaults;
245  };
246  bool learning() const override { return StaticSynapseParameters.learning; };
247 
248  NAMED_PARAMETER(weight, 0);
249  NAMED_PARAMETER(delay, 1);
250 };
251 
252 class SpikePairRuleAdditive final : public SynapseBase {
253 public:
256  : SynapseBase(SpikePairRuleAdditiveParameters.parameter_defaults)
257  {
258  check_parameter_size();
259  }
261  : SynapseBase(synapse.parameters())
262  {
263  check_parameter_size();
264  }
265  const std::string name() const override
266  {
267  return SpikePairRuleAdditiveParameters.name;
268  };
269  const std::vector<std::string> &parameter_names() const override
270  {
271  return SpikePairRuleAdditiveParameters.parameter_names;
272  };
273  const std::vector<std::string> &parameter_units() const override
274  {
275  return SpikePairRuleAdditiveParameters.parameter_units;
276  };
277  const std::vector<Real> &parameter_defaults() const override
278  {
279  return SpikePairRuleAdditiveParameters.parameter_defaults;
280  };
281  bool learning() const override
282  {
283  return SpikePairRuleAdditiveParameters.learning;
284  };
285  NAMED_PARAMETER(weight, 0);
286  NAMED_PARAMETER(delay, 1);
287  NAMED_PARAMETER(tau_plus, 2);
288  NAMED_PARAMETER(tau_minus, 3);
289  NAMED_PARAMETER(A_plus, 4);
290  NAMED_PARAMETER(A_minus, 5);
291  NAMED_PARAMETER(w_min, 6);
292  NAMED_PARAMETER(w_max, 7);
293 };
294 
296 public:
299  : SynapseBase(SpikePairRuleMultiplicativeParameters.parameter_defaults)
300  {
301  check_parameter_size();
302  }
304  : SynapseBase(synapse.parameters())
305  {
306  check_parameter_size();
307  }
308  const std::string name() const override
309  {
310  return SpikePairRuleMultiplicativeParameters.name;
311  };
312  const std::vector<std::string> &parameter_names() const override
313  {
314  return SpikePairRuleMultiplicativeParameters.parameter_names;
315  };
316  const std::vector<std::string> &parameter_units() const override
317  {
318  return SpikePairRuleMultiplicativeParameters.parameter_units;
319  };
320  const std::vector<Real> &parameter_defaults() const override
321  {
322  return SpikePairRuleMultiplicativeParameters.parameter_defaults;
323  };
324  bool learning() const override
325  {
326  return SpikePairRuleMultiplicativeParameters.learning;
327  };
328  NAMED_PARAMETER(weight, 0);
329  NAMED_PARAMETER(delay, 1);
330  NAMED_PARAMETER(tau_plus, 2);
331  NAMED_PARAMETER(tau_minus, 3);
332  NAMED_PARAMETER(A_plus, 4);
333  NAMED_PARAMETER(A_minus, 5);
334  NAMED_PARAMETER(w_min, 6);
335  NAMED_PARAMETER(w_max, 7);
336 };
337 
338 class TsodyksMarkramMechanism final : public SynapseBase {
339 public:
342  : SynapseBase(TsodyksMarkramMechanismParameters.parameter_defaults)
343  {
344  check_parameter_size();
345  }
347  : SynapseBase(synapse.parameters())
348  {
349  check_parameter_size();
350  }
351  const std::string name() const override
352  {
353  return TsodyksMarkramMechanismParameters.name;
354  };
355  const std::vector<std::string> &parameter_names() const override
356  {
357  return TsodyksMarkramMechanismParameters.parameter_names;
358  };
359  const std::vector<std::string> &parameter_units() const override
360  {
361  return TsodyksMarkramMechanismParameters.parameter_units;
362  };
363  const std::vector<Real> &parameter_defaults() const override
364  {
365  return TsodyksMarkramMechanismParameters.parameter_defaults;
366  };
367  bool learning() const override
368  {
369  return TsodyksMarkramMechanismParameters.learning;
370  };
371  NAMED_PARAMETER(weight, 0);
372  NAMED_PARAMETER(delay, 1);
373  NAMED_PARAMETER(U, 2);
374  NAMED_PARAMETER(tau_rec, 3);
375  NAMED_PARAMETER(tau_facil, 4);
376 };
377 
378 } // namespace cypress
379 
380 #undef NAMED_PARAMETER
381 #endif // CYPRESS_SYNAPSES_HPP
const Real * begin() const
Definition: synapses.hpp:163
bool learning() const override
Definition: synapses.hpp:367
virtual const std::vector< std::string > & parameter_names() const
Definition: synapses.hpp:104
const std::vector< Real > & parameters() const
Definition: synapses.hpp:126
size_t size() const
Definition: synapses.hpp:174
SpikePairRuleAdditive()
Definition: synapses.hpp:255
const std::vector< std::string > & parameter_names() const override
Definition: synapses.hpp:312
StaticSynapse()
Definition: synapses.hpp:220
bool learning() const override
Definition: synapses.hpp:281
virtual const std::vector< std::string > & parameter_units() const
Definition: synapses.hpp:112
virtual const std::string name() const
Definition: synapses.hpp:99
const std::vector< std::string > & parameter_units() const override
Definition: synapses.hpp:273
void parameters(const std::vector< Real > &params)
Definition: synapses.hpp:127
double Real
Definition: types.hpp:56
STL namespace.
Definition: synapses.hpp:71
SynapseBase(std::initializer_list< Real > parameters)
Definition: synapses.hpp:86
void check_parameter_size()
Definition: synapses.hpp:76
virtual bool learning() const
Definition: synapses.hpp:124
std::vector< Real > m_params
Definition: synapses.hpp:73
const std::string name() const override
Definition: synapses.hpp:351
const std::vector< Real > & parameter_defaults() const override
Definition: synapses.hpp:277
Definition: synapses.hpp:252
const std::vector< std::string > & parameter_units() const override
Definition: synapses.hpp:316
Definition: synapses.hpp:295
const std::string name() const override
Definition: synapses.hpp:308
Real operator[](size_t i) const
Definition: synapses.hpp:158
const std::vector< Real > & parameter_defaults() const override
Definition: synapses.hpp:363
const std::vector< std::string > & parameter_units() const override
Definition: synapses.hpp:238
const std::vector< Real > & parameter_defaults() const override
Definition: synapses.hpp:320
Definition: optional.hpp:33
const std::vector< std::string > & parameter_names() const override
Definition: synapses.hpp:355
SpikePairRuleAdditive(const StaticSynapse &synapse)
Definition: synapses.hpp:260
TsodyksMarkramMechanism(const StaticSynapse &synapse)
Definition: synapses.hpp:346
Definition: brainscales_lib.hpp:39
bool learning() const override
Definition: synapses.hpp:324
TsodyksMarkramMechanism()
Definition: synapses.hpp:341
SpikePairRuleMultiplicative()
Definition: synapses.hpp:298
const std::vector< Real > & parameter_defaults() const override
Definition: synapses.hpp:242
Definition: synapses.hpp:217
#define NAMED_PARAMETER(NAME, IDX)
Definition: synapses.hpp:39
SpikePairRuleMultiplicative(const StaticSynapse &synapse)
Definition: synapses.hpp:303
Definition: exceptions.hpp:84
virtual const std::vector< Real > & parameter_defaults() const
Definition: synapses.hpp:120
SynapseBase(std::vector< Real > parameters)
Definition: synapses.hpp:89
const std::vector< std::string > & parameter_units() const override
Definition: synapses.hpp:359
const std::vector< std::string > & parameter_names() const override
Definition: synapses.hpp:269
bool learning() const override
Definition: synapses.hpp:246
const std::vector< std::string > & parameter_names() const override
Definition: synapses.hpp:234
const std::string name() const override
Definition: synapses.hpp:265
StaticSynapse(const StaticSynapse &synapse)
Definition: synapses.hpp:224
Definition: synapses.hpp:338
Optional< size_t > parameter_index(const std::string &name) const
Definition: synapses.hpp:136
const Real * end() const
Definition: synapses.hpp:168
const std::string name() const override
Definition: synapses.hpp:230