@@ -43,6 +43,107 @@ using ResourceNeuron = knp::neuron_traits::SynapticResourceSTDPBLIFATNeuron;
4343using 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
47148template <>
48149AnnotatedNetwork 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