Kaspersky Neuromorphic Platform  1.0.0
API Reference
Loading...
Searching...
No Matches
synapse_generators.h
Go to the documentation of this file.
1
21#pragma once
22
23#include <knp/core/population.h>
24#include <knp/core/projection.h>
25
26#include <exception>
27#include <functional>
28#include <optional>
29#include <random>
30#include <tuple>
31
33
34
39{
40
45{
58template <typename SynapseType>
60 size_t presynaptic_pop_size, size_t postsynaptic_pop_size,
63{
64 return [presynaptic_pop_size, postsynaptic_pop_size,
65 syn_gen](size_t index) -> std::optional<typename knp::core::Projection<SynapseType>::Synapse>
66 {
67 const size_t index0 = index % presynaptic_pop_size;
68 const size_t index1 = index / presynaptic_pop_size;
69
70 return std::make_tuple(syn_gen(index0, index1), index0, index1);
71 };
72}
73
74
85template <typename SynapseType>
87 size_t population_size, parameters_generators::SynGen1ParamType<SynapseType> syn_gen = std::bind(
89{
90 return [syn_gen](size_t index) -> std::optional<typename knp::core::Projection<SynapseType>::Synapse>
91 { return std::make_tuple(syn_gen(index), index, index); };
92}
93
94
105template <typename SynapseType, template <typename...> class Container>
107 const Container<typename core::Projection<SynapseType>::Synapse> &container)
108{
109 return [&container](size_t index) -> std::optional<typename knp::core::Projection<SynapseType>::Synapse>
110 { return container[index]; };
111}
112
113
120template <typename SynapseType, template <typename, typename, typename...> class Map>
122{
123public:
127 using MapType =
128 Map<typename std::tuple<size_t, size_t>, typename knp::core::Projection<SynapseType>::SynapseParameters>;
129
135 explicit FromMap(const MapType &synapses_map) : iter_(synapses_map.cbegin()) {}
136
142 [[nodiscard]] typename std::optional<typename knp::core::Projection<SynapseType>::Synapse> operator()(size_t index)
143 {
144 const auto [from_index, to_index] = iter_->first;
145 auto synapse = std::make_tuple(iter_->second, from_index, to_index);
146 ++iter_;
147 return synapse;
148 }
149
150private:
151 typename MapType::const_iterator iter_;
152};
153
154
161template <typename SynapseType>
163{
164public:
173 size_t presynaptic_pop_size, size_t postsynaptic_pop_size, double connection_probability,
176 : presynaptic_pop_size_(presynaptic_pop_size),
177 postsynaptic_pop_size_(postsynaptic_pop_size),
178 connection_probability_(connection_probability),
179 syn_gen_(syn_gen),
180 mt_(std::random_device()()),
181 dist_(0, 1)
182 {
183 if (connection_probability > 1 || connection_probability < 0)
184 throw std::logic_error("Incorrect probability, set probability between 0 and 1.");
185 }
186
192 [[nodiscard]] typename std::optional<typename knp::core::Projection<SynapseType>::Synapse> operator()(size_t index)
193 {
194 const size_t index0 = index % presynaptic_pop_size_;
195 const size_t index1 = index / presynaptic_pop_size_;
196
197 if (dist_(mt_) < connection_probability_) return std::make_tuple(syn_gen_(index0, index1), index0, index1);
198 return std::nullopt;
199 }
200
201private:
202 size_t presynaptic_pop_size_;
203 size_t postsynaptic_pop_size_;
204 double connection_probability_;
206 std::mt19937 mt_;
207 std::uniform_real_distribution<double> dist_;
208};
209
210
220template <typename SynapseType>
222 size_t presynaptic_pop_size, size_t postsynaptic_pop_size,
224{
225 return [presynaptic_pop_size, postsynaptic_pop_size,
226 syn_gen](size_t index) -> std::optional<typename knp::core::Projection<SynapseType>::Synapse>
227 {
228 const size_t index0 = index % presynaptic_pop_size;
229 const size_t index1 = index / presynaptic_pop_size;
230 auto opt_result = syn_gen(index0, index1);
231
232 if (opt_result.has_value()) return std::make_tuple(opt_result.value(), index0, index1);
233 return std::nullopt;
234 };
235}
236
237
245template <typename SynapseType>
247{
248public:
256 size_t presynaptic_pop_size, size_t postsynaptic_pop_size,
257 std::function<typename knp::core::Projection<SynapseType>::SynapseParameters(size_t index0, size_t index1)>
259 : presynaptic_pop_size_(presynaptic_pop_size),
260 postsynaptic_pop_size_(postsynaptic_pop_size),
261 syn_gen_(syn_gen),
262 mt_(std::random_device()()),
263 dist_(0, postsynaptic_pop_size - 1)
264 {
265 }
266
272 [[nodiscard]] typename std::optional<typename knp::core::Projection<SynapseType>::Synapse> operator()(size_t index)
273 {
274 const size_t index0 = index % presynaptic_pop_size_;
275 const size_t index1 = dist_(mt_);
276
277 return std::make_tuple(syn_gen_(index0, index1), index0, index1);
278 }
279
280private:
281 size_t presynaptic_pop_size_;
282 size_t postsynaptic_pop_size_;
284 std::mt19937 mt_;
285 std::uniform_int_distribution<size_t> dist_;
286};
287
288
296template <typename SynapseType>
298{
299public:
307 size_t presynaptic_pop_size, size_t postsynaptic_pop_size,
308 std::function<typename knp::core::Projection<SynapseType>::SynapseParameters(size_t index0, size_t index1)>
310 : presynaptic_pop_size_(presynaptic_pop_size),
311 postsynaptic_pop_size_(postsynaptic_pop_size),
312 syn_gen_(syn_gen),
313 mt_(std::random_device()()),
314 dist_(0, presynaptic_pop_size - 1)
315 {
316 }
317
323 [[nodiscard]] typename std::optional<typename knp::core::Projection<SynapseType>::Synapse> operator()(size_t index)
324 {
325 const size_t index0 = dist_(mt_);
326 const size_t index1 = index % postsynaptic_pop_size_;
327
328 return std::make_tuple(syn_gen_(index0, index1), index0, index1);
329 }
330
331private:
332 size_t presynaptic_pop_size_;
333 size_t postsynaptic_pop_size_;
335 std::mt19937 mt_;
336 std::uniform_int_distribution<size_t> dist_;
337};
338
339
351template <typename DestinationSynapseType, typename SourceSynapseType>
353 const knp::core::Projection<SourceSynapseType> &source_proj,
356{
357 return [&source_proj,
358 syn_gen](size_t index) -> std::optional<typename knp::core::Projection<DestinationSynapseType>::Synapse>
359 {
360 auto const &synapse = source_proj[index];
361 return std::make_tuple(
362 syn_gen(index), std::get<knp::core::source_neuron_id>(synapse),
363 std::get<knp::core::target_neuron_id>(synapse));
364 };
365}
366
367} // namespace synapse_generators
368
369} // namespace knp::framework::projection
typename synapse_traits::synapse_parameters< SynapseType > SynapseParameters
Parameters of the specified synapse type.
Definition projection.h:87
std::function< std::optional< Synapse >(size_t)> SynapseGenerator
Synapse generation function type.
Definition projection.h:97
std::tuple< SynapseParameters, size_t, size_t > Synapse
Synapse description structure that contains synapse parameters and indexes of the associated neurons.
Definition projection.h:92
The FixedNumberPost class is a definition of a generator that makes connections between each presynap...
std::optional< typename knp::core::Projection< SynapseType >::Synapse > operator()(size_t index)
Call operator.
FixedNumberPost(size_t presynaptic_pop_size, size_t postsynaptic_pop_size, std::function< typename knp::core::Projection< SynapseType >::SynapseParameters(size_t index0, size_t index1)> syn_gen=parameters_generators::default_synapse_gen< SynapseType >)
Constructor.
The FixedNumberPre class is a definition of a generator that makes connections between each postsynap...
FixedNumberPre(size_t presynaptic_pop_size, size_t postsynaptic_pop_size, std::function< typename knp::core::Projection< SynapseType >::SynapseParameters(size_t index0, size_t index1)> syn_gen=parameters_generators::default_synapse_gen< SynapseType >)
Constructor.
std::optional< typename knp::core::Projection< SynapseType >::Synapse > operator()(size_t index)
Call operator.
The FixedProbability class is a definition of a generator that makes connections with some probabilit...
std::optional< typename knp::core::Projection< SynapseType >::Synapse > operator()(size_t index)
Call operator.
FixedProbability(size_t presynaptic_pop_size, size_t postsynaptic_pop_size, double connection_probability, parameters_generators::SynGen2ParamsType< SynapseType > syn_gen=parameters_generators::default_synapse_gen< SynapseType >)
Constructor.
The FromMap class is a defintion of a generator of synapses from std::map or std::unordered_map objec...
FromMap(const MapType &synapses_map)
Constructor.
Map< typename std::tuple< size_t, size_t >, typename knp::core::Projection< SynapseType >::SynapseParameters > MapType
Type of the map.
std::optional< typename knp::core::Projection< SynapseType >::Synapse > operator()(size_t index)
Call operator.
std::function< typename knp::core::Projection< SynapseType >::SynapseParameters(size_t, size_t)> SynGen2ParamsType
Two parameters (index, index) generator type.
std::function< typename knp::core::Projection< SynapseType >::SynapseParameters(size_t)> SynGen1ParamType
One parameter (index) generator type.
knp::core::Projection< SynapseType >::SynapseParameters default_synapse_gen(size_t, size_t)
Default generator of synapse parameters.
std::function< typename std::optional< typename knp::core::Projection< SynapseType >::SynapseParameters >( size_t, size_t)> SynGenOptional2ParamsType
Two parameters (index, index) generator type with optional result.
Namespace for framework projection generators.
knp::core::Projection< SynapseType >::SynapseGenerator all_to_all(size_t presynaptic_pop_size, size_t postsynaptic_pop_size, parameters_generators::SynGen2ParamsType< SynapseType > syn_gen=parameters_generators::default_synapse_gen< SynapseType >)
Make connections between each presynaptic population (source) neuron to each postsynaptic population ...
knp::core::Projection< SynapseType >::SynapseGenerator from_container(const Container< typename core::Projection< SynapseType >::Synapse > &container)
Generate synapses from container.
knp::core::Projection< SynapseType >::SynapseGenerator index_based(size_t presynaptic_pop_size, size_t postsynaptic_pop_size, parameters_generators::SynGenOptional2ParamsType< SynapseType > syn_gen)
Make connections between neurons of presynaptic and postsynaptic populations based on the synapse gen...
knp::core::Projection< DestinationSynapseType >::SynapseGenerator clone_projection(const knp::core::Projection< SourceSynapseType > &source_proj, parameters_generators::SynGen1ParamType< DestinationSynapseType > syn_gen=parameters_generators::default_synapse_gen< DestinationSynapseType >)
Make connections duplicated from another projection.
knp::core::Projection< SynapseType >::SynapseGenerator one_to_one(size_t population_size, parameters_generators::SynGen1ParamType< SynapseType > syn_gen=std::bind(parameters_generators::default_synapse_gen< SynapseType >, std::placeholders::_1, 0))
Make one-to-one connections between neurons of presynaptic and postsynaptic populations.
Projection namespace.
Definition connectors.h:35
General population interface.
General projection interface.
Parameters generators.