Hi everyone,
This isn’t a classic support request, sorry, but I couldn’t find a good category for my question.
With years of Brian/Brian2 usage, I accumulated a bunch of functions that I really would like to have inside equations. Moreover, I want them on all devices cpp
, numpy
, cython
, etc. So is there any template for such a library?
What will be very handy is to have something like this:
from brian2 import *
from brian2pls import fe
n = NeuronGroup(..., model ="dr/dt = fe(r)/tau : 1" ....)
It seems decorator @implementation
is the best way to go. So a fe
function may look like this:
@implementation('cython', f'''
cdef double fe(double x):
return {ge}*(x-{thetae}) if x-{thetae} > 0. else 0.
''')
@implementation('cpp',f''''
double fe(double x)
{{
return ((x-{thetae})<0.)?0.:{ge}*(x-{thetae});
}}''')
@check_units(x=1, result=1)
def fe(x):
return ge*(x-thetae) if x-thetae > 0. else 0.
This seems (I’m really not sure) works for both cpp
, standalone, omp device, and cython
device. It isn’t completely clear to me how to implements it for numpy
device, and do we have cuda
/gpu
device or not?
Any thoughts, suggestions, and examples are highly appreciated.
P.S. As we discussed with @mstimberg before, many of my functions can be written as a combination of brian2’s equation functions, but it is too messy. On the other hand, I want to have full control over cpp
/cython
implementation, to be sure that it is the most optimal one.