Greetings,
I am Daniel's colleague, currently working on the same project. I am writing this comment to update the thread with relevant information after the new debugging tests we have performed. Keep in mind that we are using the sPyNNaker library at version 6.0.0.
1) When conducting simple tests with the network (described by Daniel above) that includes STDP-regulated population pairs of 4x16 and 16x4 respectively, we have found that for the 2nd population pair (the one of 16x4 neurons) the following weight configuration is printed using log_info() at weight_additive_one_term_impl.c:62:
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 0: Min weight:0, Max weight:1536, A2+:460800, A2-:460800
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 1: Min weight:0, Max weight:192, A2+:57600, A2-:57600
Note that, in the Python script, the following configuration values were set: "A_plus": 300.0, "A_minus": 300.0, "w_max": 6.0, "w_min": 0.0
2) Repeating the test for STDP-regulated pairs of 4x32 and 32x4 respectively, the new weight configuration of the 32x4 pair gets printed as:
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 0: Min weight:0, Max weight:768, A2+:230400, A2-:230400
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 1: Min weight:0, Max weight:192, A2+:57600, A2-:57600
3) Again, after repeating the test for a greater number of neurons, including STDP-regulated pairs of 4x40 and 40x4 respectively, the following weight configuration is printed:
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 0: Min weight:0, Max weight:384, A2+:115200, A2-:115200
[INFO] (weight_additive_one_term_impl.c: 67): Synapse type 1: Min weight:0, Max weight:96, A2+:28800, A2-:28800
4) After analyzing these three outputs, we believe that the size of the pre-synaptic population is affecting the different printed values. In this sense, it seems that the number of bits needed for the number of neurons of the pre-synaptic population applies a shift-right operation.
5) The hypothesis that we are considering is an issue with the memory mapping of the allocated and copied input data regarding the STDP parameters: the LUT tables, the weight configuration, etc. Specifically, memory appears to be shifted, which is not a misguided observation since we have found that, (for example) for an STDP-regulated synapsis of 32x4, the following STDP values are printed when calling log_info at weight_additive_one_term_impl.h:120:
[INFO] (timing_pair_impl.h: 161): time_since_last_pre_event=1, decayed_r1=634
[INFO] (synapse_dynamics_stdp_mad_impl.c: 204): Applying pre-synaptic event at time:25 last post time:8
[INFO] (timing_pair_impl.h: 129): time_since_last_post_event=17, decayed_o1=0
[INFO] (weight_additive_one_term_impl.h: 128): old_weight:0, a2+:634, a2-:0, scaled a2+:-9827, scaled a2-:0, new_weight:0
[INFO] (synapse_dynamics_stdp_mad_impl.c: 414): Acummulation (stdp):0
It can be seen how the A2+ has an inconsistent value, and how the STDP does not properly perform the accumulation.
6) Although we have tried several options for countering this issue (such as modifying the memory pointer that is returned when initializing the LUT tables of the STDP), none of them have been successful. Thus, we think that this cannot be manually patched from the C backend of sPyNNaker since (1) the memory mapping is already given as input (at call initialise_synapse_regions() of c_main_synapses.c) and (2) no information on the number of pre-synaptic neurons is handled from the STDP code for us to make up for the memory mapping.
Please, correct any blunder that you may find in this text. The given analysis is based on preliminary work and I am not an expert on the Spinnaker toolset.
Thanks in advance.
Best regards,
Pablo