The comparisons look indeed very good. Fingers crossed it will scale well!
Delays: Individual delays are something that is still a bit underdeveloped in Auryn because I never played with this in my simulations. Out of the box Auryn supports "axonal" delays on a per SpikingGroup/NeuronGroup basis (can be set in SpikingGroup https://fzenke.net/auryn/doxygen/curren ... f84e08f079) - not on a per Connection basis.
However, per Connection delays should be easy enough to implement by dint of SpikeDelay https://fzenke.net/auryn/doxygen/curren ... Delay.html. This is possible as long as it is fine to make the delays larger than the axonal delay (that's because we use the axonal delay as MINDELAY for parallel simulations). If adding more delay is fine, it can be added to a connection object as a "dendritic" delay.
To do this you will have to modify the propagate function in your Connection class. To test whether this works I just added and pushed a new class DelayConnection to the develop branch which illustrates the basic principle https://github.com/fzenke/auryn/blob/de ... ection.cpp
Code: Select all
void DelayConnection::propagate()
{
// pop buffer from delay and push spikes from src to back
src_dly->get_spikes_immediate()->clear();
src_dly->push_back(src->get_spikes());
// do normal forward propagation as in SparseConnection
for (SpikeContainer::const_iterator spike = src_dly->get_spikes()->begin() ;
spike != src_dly->get_spikes()->end() ;
++spike ) {
for ( AurynLong c = w->get_row_begin_index(*spike) ;
c < w->get_row_end_index(*spike) ;
++c ) {
transmit( w->get_colind(c) , w->get_value(c) );
}
}
}
I do not have the time to test this extensively right now, but https://github.com/fzenke/auryn/blob/de ... ection.cpp illustrate a basic use and it seems to be doing the right thing on first coarse inspection: Finally, if you need per-synapse delays it should be relatively simple to extend the above code to add a complex synaptic state storing the per-synapse delay and then inserting the spikes from src sensibly in the ring buffer of src_dly such that they end up having the right delay. SpikeDelay has functions to insert spikes at arbitrary locations into the ringbuffer if I remember correctly. However, these functions should be tested thoroughly before relying on them.