Skip to content

Commit c1cd738

Browse files
committed
Separated network construction into multiple functions: KasperskyLab#145
1 parent 5256d78 commit c1cd738

2 files changed

Lines changed: 153 additions & 110 deletions

File tree

examples/mnist-learn/models/altai/construct_network.cpp

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ using ResourceNeuron = knp::neuron_traits::SynapticResourceSTDPAltAILIFNeuron;
4242
using ResourceNeuronData = knp::neuron_traits::neuron_parameters<ResourceNeuron>;
4343

4444

45-
template <>
46-
AnnotatedNetwork construct_network<knp::neuron_traits::AltAILIF>(const ModelDescription &model_desc)
45+
struct NetworkPopulations
4746
{
48-
AnnotatedNetwork result;
49-
NetworkConstructor constructor(result);
47+
const PopulationInfo &input_pop_, output_pop_, gate_pop_, raster_pop_, target_pop_;
48+
};
5049

51-
for (size_t i = 0; i < classes_amount; ++i) result.data_.wta_borders_.push_back(neurons_per_column * (i + 1));
5250

51+
static NetworkPopulations create_populations(NetworkConstructor &constructor)
52+
{
5353
ResourceNeuronData default_neuron;
5454
default_neuron.activation_threshold_ = threshold;
5555
ResourceNeuronData input_neuron = default_neuron;
@@ -78,67 +78,88 @@ AnnotatedNetwork construct_network<knp::neuron_traits::AltAILIF>(const ModelDesc
7878
constructor.add_population(default_neuron, classes_amount, PopulationRole::NORMAL, false, "GATE");
7979
const auto &raster_pop = constructor.add_channeled_population(input_size, true);
8080
const auto &target_pop = constructor.add_channeled_population(classes_amount, false);
81+
return {input_pop, output_pop, gate_pop, raster_pop, target_pop};
82+
}
8183

82-
result.data_.wta_data_.emplace_back().first.push_back(input_pop.uid_);
8384

85+
static void create_projections(
86+
AnnotatedNetwork &network, NetworkConstructor &constructor, const NetworkPopulations &pops)
87+
{
8488
ResourceSynapseParams raster_to_input_synapse;
8589
raster_to_input_synapse.rule_.dopamine_plasticity_period_ = raster_to_input_synapse_dopamine_plasticity_period;
8690
raster_to_input_synapse.rule_.w_min_ = raster_to_input_synapse_w_max;
8791
raster_to_input_synapse.rule_.w_max_ = raster_to_input_synapse_w_min;
8892
raster_to_input_synapse.rule_.synaptic_resource_ =
8993
resource_from_weight(0, raster_to_input_synapse.rule_.w_min_, raster_to_input_synapse.rule_.w_max_);
9094
auto raster_to_input_proj = constructor.add_projection(
91-
raster_to_input_synapse, knp::framework::projection::creators::all_to_all<ResourceSynapse>, raster_pop,
92-
input_pop, true, false);
93-
result.data_.projections_from_raster_.push_back(raster_to_input_proj);
95+
raster_to_input_synapse, knp::framework::projection::creators::all_to_all<ResourceSynapse>, pops.raster_pop_,
96+
pops.input_pop_, true, false);
97+
network.data_.projections_from_raster_.push_back(raster_to_input_proj);
9498

9599
DeltaSynapseParams target_to_input_synapse_dopamine;
96100
target_to_input_synapse_dopamine.output_type_ = knp::synapse_traits::OutputType::DOPAMINE;
97101
target_to_input_synapse_dopamine.weight_ = 0.179376 * 1000;
98102
target_to_input_synapse_dopamine.delay_ = 3;
99103
auto target_to_l_proj_dopamine = constructor.add_projection(
100-
target_to_input_synapse_dopamine, knp::framework::projection::creators::aligned<DeltaSynapse>, target_pop,
101-
input_pop, false, false);
102-
result.data_.projections_from_classes_.push_back(target_to_l_proj_dopamine);
104+
target_to_input_synapse_dopamine, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.target_pop_,
105+
pops.input_pop_, false, false);
106+
network.data_.projections_from_classes_.push_back(target_to_l_proj_dopamine);
103107

104108
DeltaSynapseParams target_to_input_synapse_excitatory;
105109
target_to_input_synapse_excitatory.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
106110
target_to_input_synapse_excitatory.weight_ = -30 * 1000;
107111
target_to_input_synapse_excitatory.delay_ = 4;
108112
auto target_to_l_proj_excitatory = constructor.add_projection(
109-
target_to_input_synapse_excitatory, knp::framework::projection::creators::all_to_all<DeltaSynapse>, target_pop,
110-
input_pop, false, false);
111-
result.data_.projections_from_classes_.push_back(target_to_l_proj_excitatory);
113+
target_to_input_synapse_excitatory, knp::framework::projection::creators::all_to_all<DeltaSynapse>,
114+
pops.target_pop_, pops.input_pop_, false, false);
115+
network.data_.projections_from_classes_.push_back(target_to_l_proj_excitatory);
112116

113117
DeltaSynapseParams target_to_gate_synapse;
114118
target_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
115119
target_to_gate_synapse.weight_ = 10 * 1000;
116120
auto target_to_gate_proj = constructor.add_projection(
117-
target_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, target_pop, gate_pop,
118-
false, false);
119-
result.data_.projections_from_classes_.push_back(target_to_gate_proj);
121+
target_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.target_pop_,
122+
pops.gate_pop_, false, false);
123+
network.data_.projections_from_classes_.push_back(target_to_gate_proj);
120124

121125
DeltaSynapseParams input_to_output_synapse;
122126
input_to_output_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
123127
input_to_output_synapse.weight_ = 10.f * 1000;
124128
knp::core::UID l_to_output_proj = constructor.add_projection(
125-
input_to_output_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, input_pop, output_pop,
126-
false, true);
127-
result.data_.wta_data_[0].second.push_back(l_to_output_proj);
129+
input_to_output_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.input_pop_,
130+
pops.output_pop_, false, true);
131+
network.data_.wta_data_[0].second.push_back(l_to_output_proj);
128132

129133
DeltaSynapseParams output_to_gate_synapse;
130134
output_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::BLOCKING;
131135
output_to_gate_synapse.weight_ = -10.f;
132136
constructor.add_projection(
133-
output_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, output_pop, gate_pop,
134-
false, false);
137+
output_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.output_pop_,
138+
pops.gate_pop_, false, false);
135139

136140
DeltaSynapseParams gate_to_input_synapse;
137141
gate_to_input_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
138142
gate_to_input_synapse.weight_ = 10.f * 1000;
139143
constructor.add_projection(
140-
gate_to_input_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, gate_pop, input_pop, false,
141-
false);
144+
gate_to_input_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.gate_pop_,
145+
pops.input_pop_, false, false);
146+
}
147+
148+
149+
template <>
150+
AnnotatedNetwork construct_network<knp::neuron_traits::AltAILIF>(const ModelDescription &model_desc)
151+
{
152+
AnnotatedNetwork result;
153+
NetworkConstructor constructor(result);
154+
155+
for (size_t i = 0; i < classes_amount; ++i) result.data_.wta_borders_.push_back(neurons_per_column * (i + 1));
156+
157+
NetworkPopulations pops = create_populations(constructor);
158+
159+
// Add input_pop as WTA sender.
160+
result.data_.wta_data_.emplace_back().first.push_back(pops.input_pop_.uid_);
161+
162+
create_projections(result, constructor, pops);
142163

143164
return result;
144165
}

examples/mnist-learn/models/blifat/construct_network.cpp

Lines changed: 107 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,107 @@ using ResourceNeuron = knp::neuron_traits::SynapticResourceSTDPBLIFATNeuron;
4343
using ResourceNeuronData = knp::neuron_traits::neuron_parameters<ResourceNeuron>;
4444

4545

46+
struct NetworkPopulations
47+
{
48+
const PopulationInfo &input_pop_, output_pop_, gate_pop_, raster_pop_, target_pop_;
49+
};
50+
51+
52+
static NetworkPopulations create_populations(NetworkConstructor &constructor)
53+
{
54+
// Parameters for a default neuron.
55+
// Online Help link: https://click.kaspersky.com/?hl=en-US&version=2.0&pid=KNP&link=online_help&helpid=235859
56+
ResourceNeuronData default_neuron{{}};
57+
default_neuron.activation_threshold_ = default_threshold;
58+
ResourceNeuronData input_neuron = default_neuron;
59+
// Corresponds to L characteristic time 3.
60+
input_neuron.potential_decay_ = input_neuron_potential_decay;
61+
input_neuron.d_h_ = hebbian_plasticity;
62+
input_neuron.dopamine_plasticity_time_ = neuron_dopamine_period;
63+
input_neuron.synapse_sum_threshold_coefficient_ = threshold_weight_coeff;
64+
input_neuron.isi_max_ = isi_max;
65+
input_neuron.min_potential_ = min_potential;
66+
input_neuron.stability_change_parameter_ = stability_change_parameter;
67+
input_neuron.resource_drain_coefficient_ = resource_drain_coefficient;
68+
input_neuron.stochastic_stimulation_ = stochastic_stimulation;
69+
70+
const auto &input_pop =
71+
constructor.add_population(input_neuron, num_input_neurons, PopulationRole::INPUT, true, "INPUT");
72+
const auto &output_pop =
73+
constructor.add_population(default_neuron, classes_amount, PopulationRole::OUTPUT, true, "OUTPUT");
74+
const auto &gate_pop =
75+
constructor.add_population(default_neuron, classes_amount, PopulationRole::NORMAL, false, "GATE");
76+
const auto &raster_pop = constructor.add_channeled_population(input_size, true);
77+
const auto &target_pop = constructor.add_channeled_population(classes_amount, false);
78+
79+
return {input_pop, output_pop, gate_pop, raster_pop, target_pop};
80+
}
81+
82+
83+
static void create_projections(
84+
AnnotatedNetwork &network, NetworkConstructor &constructor, const NetworkPopulations &pops)
85+
{
86+
ResourceSynapseParams raster_to_input_synapse;
87+
raster_to_input_synapse.rule_.synaptic_resource_ =
88+
resource_from_weight(base_weight_value, min_synaptic_weight, max_synaptic_weight);
89+
raster_to_input_synapse.rule_.dopamine_plasticity_period_ = synapse_dopamine_period;
90+
raster_to_input_synapse.rule_.w_min_ = min_synaptic_weight;
91+
raster_to_input_synapse.rule_.w_max_ = max_synaptic_weight;
92+
auto raster_to_input_proj = constructor.add_projection(
93+
raster_to_input_synapse, knp::framework::projection::creators::all_to_all<ResourceSynapse>, pops.raster_pop_,
94+
pops.input_pop_, true, false);
95+
network.data_.projections_from_raster_.push_back(raster_to_input_proj);
96+
97+
DeltaSynapseData target_to_input_synapse_dopamine;
98+
target_to_input_synapse_dopamine.weight_ = 0.18;
99+
target_to_input_synapse_dopamine.delay_ = 3;
100+
target_to_input_synapse_dopamine.output_type_ = knp::synapse_traits::OutputType::DOPAMINE;
101+
auto target_to_input_proj_dopamine = constructor.add_projection(
102+
target_to_input_synapse_dopamine, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.target_pop_,
103+
pops.input_pop_, false, false);
104+
network.data_.projections_from_classes_.push_back(target_to_input_proj_dopamine);
105+
106+
DeltaSynapseData input_to_output_synapse;
107+
input_to_output_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
108+
input_to_output_synapse.weight_ = 10;
109+
auto input_to_output_proj = constructor.add_projection(
110+
input_to_output_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.input_pop_,
111+
pops.output_pop_, false, true);
112+
network.data_.wta_data_.back().second.push_back(input_to_output_proj);
113+
114+
DeltaSynapseData output_to_gate_synapse;
115+
output_to_gate_synapse.weight_ = -10;
116+
output_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::BLOCKING;
117+
auto output_to_gate_proj = constructor.add_projection(
118+
output_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.output_pop_,
119+
pops.gate_pop_, false, false);
120+
121+
DeltaSynapseData target_to_gate_synapse;
122+
target_to_gate_synapse.weight_ = 10.f;
123+
target_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
124+
auto target_to_gate_proj = constructor.add_projection(
125+
target_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.target_pop_,
126+
pops.gate_pop_, false, false);
127+
network.data_.projections_from_classes_.push_back(target_to_gate_proj);
128+
129+
DeltaSynapseData gate_to_input_synapse;
130+
gate_to_input_synapse.weight_ = 10;
131+
gate_to_input_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
132+
auto gate_to_input_proj = constructor.add_projection(
133+
gate_to_input_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, pops.gate_pop_,
134+
pops.input_pop_, false, false);
135+
136+
DeltaSynapseData target_to_input_synapse_excitatory;
137+
target_to_input_synapse_excitatory.weight_ = -30;
138+
target_to_input_synapse_excitatory.delay_ = 4;
139+
target_to_input_synapse_excitatory.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
140+
auto target_to_input_proj_excitatory = constructor.add_projection(
141+
target_to_input_synapse_excitatory, knp::framework::projection::creators::aligned<DeltaSynapse>,
142+
pops.target_pop_, pops.input_pop_, false, false);
143+
network.data_.projections_from_classes_.push_back(target_to_input_proj_excitatory);
144+
}
145+
146+
46147
// Online Help link: https://click.kaspersky.com/?hl=en-US&version=2.0&pid=KNP&link=online_help&helpid=235801
47148
template <>
48149
AnnotatedNetwork construct_network<knp::neuron_traits::BLIFATNeuron>(const ModelDescription &model_desc)
@@ -55,91 +156,12 @@ AnnotatedNetwork construct_network<knp::neuron_traits::BLIFATNeuron>(const Model
55156
{
56157
NetworkConstructor constructor(result);
57158

58-
// Parameters for a default neuron.
59-
// Online Help link: https://click.kaspersky.com/?hl=en-US&version=2.0&pid=KNP&link=online_help&helpid=235859
60-
ResourceNeuronData default_neuron{{}};
61-
default_neuron.activation_threshold_ = default_threshold;
62-
ResourceNeuronData input_neuron = default_neuron;
63-
// Corresponds to L characteristic time 3.
64-
input_neuron.potential_decay_ = input_neuron_potential_decay;
65-
input_neuron.d_h_ = hebbian_plasticity;
66-
input_neuron.dopamine_plasticity_time_ = neuron_dopamine_period;
67-
input_neuron.synapse_sum_threshold_coefficient_ = threshold_weight_coeff;
68-
input_neuron.isi_max_ = isi_max;
69-
input_neuron.min_potential_ = min_potential;
70-
input_neuron.stability_change_parameter_ = stability_change_parameter;
71-
input_neuron.resource_drain_coefficient_ = resource_drain_coefficient;
72-
input_neuron.stochastic_stimulation_ = stochastic_stimulation;
73-
74-
const auto &input_pop =
75-
constructor.add_population(input_neuron, num_input_neurons, PopulationRole::INPUT, true, "INPUT");
76-
const auto &output_pop =
77-
constructor.add_population(default_neuron, classes_amount, PopulationRole::OUTPUT, true, "OUTPUT");
78-
const auto &gate_pop =
79-
constructor.add_population(default_neuron, classes_amount, PopulationRole::NORMAL, false, "GATE");
80-
const auto &raster_pop = constructor.add_channeled_population(input_size, true);
81-
const auto &target_pop = constructor.add_channeled_population(classes_amount, false);
82-
83-
result.data_.wta_data_.emplace_back().first.push_back(input_pop.uid_);
84-
85-
ResourceSynapseParams raster_to_input_synapse;
86-
raster_to_input_synapse.rule_.synaptic_resource_ =
87-
resource_from_weight(base_weight_value, min_synaptic_weight, max_synaptic_weight);
88-
raster_to_input_synapse.rule_.dopamine_plasticity_period_ = synapse_dopamine_period;
89-
raster_to_input_synapse.rule_.w_min_ = min_synaptic_weight;
90-
raster_to_input_synapse.rule_.w_max_ = max_synaptic_weight;
91-
auto raster_to_input_proj = constructor.add_projection(
92-
raster_to_input_synapse, knp::framework::projection::creators::all_to_all<ResourceSynapse>, raster_pop,
93-
input_pop, true, false);
94-
result.data_.projections_from_raster_.push_back(raster_to_input_proj);
95-
96-
DeltaSynapseData target_to_input_synapse_dopamine;
97-
target_to_input_synapse_dopamine.weight_ = 0.18;
98-
target_to_input_synapse_dopamine.delay_ = 3;
99-
target_to_input_synapse_dopamine.output_type_ = knp::synapse_traits::OutputType::DOPAMINE;
100-
auto target_to_input_proj_dopamine = constructor.add_projection(
101-
target_to_input_synapse_dopamine, knp::framework::projection::creators::aligned<DeltaSynapse>, target_pop,
102-
input_pop, false, false);
103-
result.data_.projections_from_classes_.push_back(target_to_input_proj_dopamine);
104-
105-
DeltaSynapseData input_to_output_synapse;
106-
input_to_output_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
107-
input_to_output_synapse.weight_ = 10;
108-
auto input_to_output_proj = constructor.add_projection(
109-
input_to_output_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, input_pop, output_pop,
110-
false, true);
111-
result.data_.wta_data_[i].second.push_back(input_to_output_proj);
112-
113-
DeltaSynapseData output_to_gate_synapse;
114-
output_to_gate_synapse.weight_ = -10;
115-
output_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::BLOCKING;
116-
auto output_to_gate_proj = constructor.add_projection(
117-
output_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, output_pop, gate_pop,
118-
false, false);
119-
120-
DeltaSynapseData target_to_gate_synapse;
121-
target_to_gate_synapse.weight_ = 10.f;
122-
target_to_gate_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
123-
auto target_to_gate_proj = constructor.add_projection(
124-
target_to_gate_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, target_pop, gate_pop,
125-
false, false);
126-
result.data_.projections_from_classes_.push_back(target_to_gate_proj);
127-
128-
DeltaSynapseData gate_to_input_synapse;
129-
gate_to_input_synapse.weight_ = 10;
130-
gate_to_input_synapse.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
131-
auto gate_to_input_proj = constructor.add_projection(
132-
gate_to_input_synapse, knp::framework::projection::creators::aligned<DeltaSynapse>, gate_pop, input_pop,
133-
false, false);
134-
135-
DeltaSynapseData target_to_input_synapse_excitatory;
136-
target_to_input_synapse_excitatory.weight_ = -30;
137-
target_to_input_synapse_excitatory.delay_ = 4;
138-
target_to_input_synapse_excitatory.output_type_ = knp::synapse_traits::OutputType::EXCITATORY;
139-
auto target_to_input_proj_excitatory = constructor.add_projection(
140-
target_to_input_synapse_excitatory, knp::framework::projection::creators::aligned<DeltaSynapse>, target_pop,
141-
input_pop, false, false);
142-
result.data_.projections_from_classes_.push_back(target_to_input_proj_excitatory);
159+
NetworkPopulations pops = create_populations(constructor);
160+
161+
// Add input_pop as WTA sender.
162+
result.data_.wta_data_.emplace_back().first.push_back(pops.input_pop_.uid_);
163+
164+
create_projections(result, constructor, pops);
143165
}
144166

145167
return result;

0 commit comments

Comments
 (0)