Cypress  1.0
C++ Spiking Neural Network Simulation Framework
neurons_base.hpp
Go to the documentation of this file.
1 /*
2  * Cypress -- C++ Spiking Neural Network Simulation Framework
3  * Copyright (C) 2016 Andreas Stöckel
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 
28 #pragma once
29 
30 #ifndef CYPRESS_CORE_NEURONS_BASE_HPP
31 #define CYPRESS_CORE_NEURONS_BASE_HPP
32 
33 #include <cstdint>
34 #include <memory>
35 #include <string>
36 #include <vector>
37 
38 #include <cypress/core/data.hpp>
40 #include <cypress/core/types.hpp>
41 #include <cypress/util/matrix.hpp>
43 
44 namespace cypress {
45 
46 class NullNeuron;
47 class NullNeuronParameters;
48 class NullNeuronSignals;
49 
54 class NeuronType {
55 protected:
59  NeuronType(const std::string &name,
60  const std::vector<std::string> &parameter_names,
61  const std::vector<std::string> &parameter_units,
62  const std::vector<Real> &parameter_defaults,
63  const std::vector<std::string> &signal_names,
64  const std::vector<std::string> &signal_units,
66  : name(name),
67  parameter_names(parameter_names),
68  parameter_units(parameter_units),
69  parameter_defaults(parameter_defaults),
70  signal_names(signal_names),
71  signal_units(signal_units),
72  conductance_based(conductance_based),
73  spike_source(spike_source)
74  {
75  }
76 
77 public:
78  NeuronType(const NeuronType &) = delete;
79  NeuronType(NeuronType &&) = delete;
80  NeuronType &operator=(const NeuronType &) = delete;
81  NeuronType &operator=(NeuronType &&) = delete;
82 
86  const std::string name;
87 
91  const std::vector<std::string> parameter_names;
92 
96  const std::vector<std::string> parameter_units;
97 
101  const std::vector<Real> parameter_defaults;
102 
106  const std::vector<std::string> signal_names;
107 
111  const std::vector<std::string> signal_units;
112 
116  const bool conductance_based;
117 
121  const bool spike_source;
122 
126  Optional<size_t> parameter_index(const std::string &name) const;
127 
131  Optional<size_t> signal_index(const std::string &name) const;
132 };
133 
137 template <typename Parameters_, typename Signals_>
138 class NeuronTypeBase : public NeuronType {
139 public:
140  using Parameters = Parameters_;
141  using Signals = Signals_;
142 
144 };
145 
152 protected:
156  NeuronParameters(std::initializer_list<Real> parameters)
157  {
158  for (auto &p : write_parameters()) {
159  p = std::vector<Real>(parameters);
160  }
161  }
162 
166  NeuronParameters(const std::vector<Real> &parameters)
167  {
168  for (auto &p : write_parameters()) {
169  p = parameters;
170  }
171  }
172 
173 public:
178  NeuronParameters(std::shared_ptr<PopulationData> data, NeuronIndex nid0,
179  NeuronIndex nid1)
180  : PopulationDataView(std::move(data), nid0, nid1, true, false, false)
181  {
182  }
183 
187  const std::vector<Real> &parameters() const { return read_parameters(); }
188 
195  void parameters(std::vector<Real> parameters)
196  {
197  for (auto &p : write_parameters()) {
198  p = parameters;
199  }
200  }
201 
208  void set(size_t idx, Real value)
209  {
210  for (auto &p : write_parameters()) {
211  p[idx] = value;
212  }
213  }
214 
219  Real operator[](size_t i) const { return read_parameters()[i]; }
220 
224  const Real *begin() const { return &read_parameters().front(); }
225 
229  const Real *end() const { return &read_parameters().back() + 1; }
230 
235  size_t size() const { return get_parameters_size(); }
236 };
237 
242 template <typename Impl, typename Type_>
244 public:
248  using Type = Type_;
249 
251 
256  {
257  }
258 
266  NeuronParametersBase(std::initializer_list<Impl> list)
267  : NeuronParameters(PopulationDataView::from_sequence(list))
268  {
269  }
270 
278  NeuronParametersBase(std::vector<Impl> list)
279  : NeuronParameters(PopulationDataView::from_sequence(list))
280  {
281  }
282 };
283 
287 template <typename Impl, typename Type, size_t Size>
289  : public NeuronParametersBase<Impl, Type> {
290 public:
292 
297 
301  ConstantSizeNeuronParametersBase(const std::vector<Real> &parameters)
302  : NeuronParametersBase<Impl, Type>(parameters)
303  {
304  if (parameters.size() != Size) {
306  "Number of parameters in the parameter vector does not match "
307  "the number of parameters.");
308  }
309  }
310 
314  static constexpr size_t size() { return Size; }
315 };
316 
323 protected:
329  NeuronSignals(size_t signal_count)
330  {
331  for (auto &p : write_record()) {
332  p.resize(signal_count);
333  }
334  for (auto &p : write_data()) {
335  p.resize(signal_count);
336  }
337  }
338 
339 public:
344  NeuronSignals(std::shared_ptr<PopulationData> data, NeuronIndex nid0,
345  NeuronIndex nid1)
346  : PopulationDataView(std::move(data), nid0, nid1, false, true, true)
347  {
348  }
349 
358  void record(size_t i, bool record = true)
359  {
360  for (auto &p : write_record()) {
361  p[i] = record;
362  }
363  }
364 
368  bool is_recording(size_t i) const { return read_record()[i]; }
369 
373  void data(size_t i, std::shared_ptr<Matrix<Real>> matrix)
374  {
375  for (auto &p : write_data()) {
376  p[i] = matrix;
377  }
378  }
379 
388  std::shared_ptr<Matrix<Real>> data_ptr(size_t i) const
389  {
390  static std::shared_ptr<Matrix<Real>> empty =
391  std::make_shared<Matrix<Real>>();
392  auto res = const_cast<NeuronSignals *>(this)->read_data()[i];
393  if (!res) {
394  if (!is_recording(i)) {
396  }
397  return empty;
398  }
399  return res;
400  }
401 
410  const Matrix<Real> &data(size_t i) const { return *data_ptr(i); }
411 
415  size_t size() const { return get_record_size(); }
416 };
417 
422 template <class Impl, class Type_, size_t Size>
424 public:
428  using Type = Type_;
429 
431 
437 
442  NeuronSignalsBase(std::initializer_list<std::string> record_signal_names)
444  {
445  for (auto &signal : record_signal_names) {
446  auto idx = Type::inst().signal_index(signal);
447  if (!idx.valid()) {
448  throw InvalidSignal(std::string("Signal with name \"") +
449  signal + "\" does not exist.");
450  }
451  record(idx.value());
452  }
453  }
454 
458  static constexpr size_t size() { return Size; }
459 };
460 
461 /*
462  * NullNeuron
463  */
465 class NullNeuronSignals;
466 
470 class NullNeuron final
471  : public NeuronTypeBase<NullNeuronParameters, NullNeuronSignals> {
472 private:
473  NullNeuron();
474 
475 public:
476  static const NullNeuron &inst();
477 };
478 
483  : public ConstantSizeNeuronParametersBase<NullNeuronParameters, NullNeuron,
484  0> {
485 public:
488 };
489 
490 class NullNeuronSignals final
491  : public NeuronSignalsBase<NullNeuronSignals, NullNeuron, 0> {
492 public:
495 };
496 } // namespace cypress
497 
498 #endif /* CYPRESS_CORE_NEURONS_BASE_HPP */
Definition: neurons_base.hpp:54
const bool conductance_based
Definition: neurons_base.hpp:116
Optional< size_t > parameter_index(const std::string &name) const
const std::vector< std::string > signal_names
Definition: neurons_base.hpp:106
Definition: neurons.hpp:518
int32_t NeuronIndex
Definition: types.hpp:74
const bool spike_source
Definition: neurons_base.hpp:121
static constexpr size_t size()
Definition: neurons_base.hpp:314
NeuronParameters(std::shared_ptr< PopulationData > data, NeuronIndex nid0, NeuronIndex nid1)
Definition: neurons_base.hpp:178
NeuronParametersBase()
Definition: neurons_base.hpp:255
Definition: exceptions.hpp:100
NeuronSignals(std::shared_ptr< PopulationData > data, NeuronIndex nid0, NeuronIndex nid1)
Definition: neurons_base.hpp:344
NeuronSignalsBase(std::initializer_list< std::string > record_signal_names)
Definition: neurons_base.hpp:442
void record(size_t i, bool record=true)
Definition: neurons_base.hpp:358
double Real
Definition: types.hpp:56
STL namespace.
Definition: neurons_base.hpp:490
Definition: neurons_base.hpp:470
Definition: neurons_base.hpp:151
Definition: neurons.hpp:283
const Real * begin() const
Definition: neurons_base.hpp:224
NeuronType & operator=(const NeuronType &)=delete
const std::string name
Definition: neurons_base.hpp:86
const Real * end() const
Definition: neurons_base.hpp:229
Definition: matrix.hpp:51
Definition: neurons_base.hpp:288
Definition: neurons.hpp:548
size_t size() const
Definition: neurons_base.hpp:235
NeuronSignals(size_t signal_count)
Definition: neurons_base.hpp:329
Definition: neurons_base.hpp:423
Definition: neurons_base.hpp:243
NeuronType(const std::string &name, const std::vector< std::string > &parameter_names, const std::vector< std::string > &parameter_units, const std::vector< Real > &parameter_defaults, const std::vector< std::string > &signal_names, const std::vector< std::string > &signal_units, bool conductance_based, bool spike_source)
Definition: neurons_base.hpp:59
NeuronParametersBase(std::vector< Impl > list)
Definition: neurons_base.hpp:278
Optional< size_t > signal_index(const std::string &name) const
std::shared_ptr< Matrix< Real > > data_ptr(size_t i) const
Definition: neurons_base.hpp:388
const std::vector< std::string > parameter_names
Definition: neurons_base.hpp:91
Definition: optional.hpp:33
ConstantSizeNeuronParametersBase(const std::vector< Real > &parameters)
Definition: neurons_base.hpp:301
NeuronParametersBase(std::initializer_list< Impl > list)
Definition: neurons_base.hpp:266
Definition: neurons_base.hpp:138
Definition: data.hpp:383
Definition: brainscales_lib.hpp:39
void parameters(std::vector< Real > parameters)
Definition: neurons_base.hpp:195
NeuronSignalsBase()
Definition: neurons_base.hpp:436
Real operator[](size_t i) const
Definition: neurons_base.hpp:219
const std::vector< Real > & parameters() const
Definition: neurons_base.hpp:187
size_t size() const
Definition: neurons_base.hpp:415
static constexpr size_t size()
Definition: neurons_base.hpp:458
Definition: neurons_base.hpp:322
Definition: neurons.hpp:527
void data(size_t i, std::shared_ptr< Matrix< Real >> matrix)
Definition: neurons_base.hpp:373
const std::vector< std::string > parameter_units
Definition: neurons_base.hpp:96
bool is_recording(size_t i) const
Definition: neurons_base.hpp:368
NeuronParameters(std::initializer_list< Real > parameters)
Definition: neurons_base.hpp:156
Definition: exceptions.hpp:84
Definition: exceptions.hpp:140
NeuronParameters(const std::vector< Real > &parameters)
Definition: neurons_base.hpp:166
Definition: neurons_base.hpp:482
const std::vector< std::string > signal_units
Definition: neurons_base.hpp:111
const Matrix< Real > & data(size_t i) const
Definition: neurons_base.hpp:410
const std::vector< Real > parameter_defaults
Definition: neurons_base.hpp:101