Source code for bmtk.simulator.filternet.lgnmodel.transferfunction

from sympy.utilities.lambdify import lambdify
from sympy import Matrix
import sympy.parsing.sympy_parser as symp
import sympy.abc
import numpy as np


[docs]class ScalarTransferFunction(object): def __init__(self, transfer_function_string, symbol=sympy.abc.s): self.symbol = symbol self.transfer_function_string = transfer_function_string # replacing sympy.Heaviside() with np.heaviside() for better performance modules = [{'Heaviside': lambda x, y=0.5: np.heaviside(x, 0.5)}, 'numpy', 'sympy'] self.closure = lambdify(self.symbol, symp.parse_expr(self.transfer_function_string), modules=modules) def __call__(self, s): return self.closure(s)
[docs] def to_dict(self): return {'class': (__name__, self.__class__.__name__), 'function': self.transfer_function_string}
[docs] def imshow(self, rates, times=None, show=True): import matplotlib.pyplot as plt vals = [self(rate) for rate in rates] times = np.linspace(0.0, 1.0, len(rates)) if times is None else times fig, ax1 = plt.subplots() ax1.set_xlabel('time (seconds)') ax1.set_ylabel(str(self.symbol), color='b') ax1.plot(times, rates, '--b') ax1.tick_params(axis='y', labelcolor='b') ax2 = ax1.twinx() ax2.set_ylabel('transform', color='r') ax2.plot(times, vals, 'r') ax2.tick_params(axis='y', labelcolor='r') plt.title(self.transfer_function_string) if show: plt.show()
[docs]class MultiTransferFunction(object): def __init__(self, symbol_tuple, transfer_function_string): self.symbol_tuple = symbol_tuple self.transfer_function_string = transfer_function_string modules = [{'Heaviside': lambda x, y=0.5: np.heaviside(x, 0.5)}, 'numpy', 'sympy'] self.closure = lambdify(self.symbol_tuple,symp.parse_expr(self.transfer_function_string), modules=modules) def __call__(self, *s): if isinstance(s[0], (float,)): return self.closure(*s) else: return np.array(list(map(lambda x: self.closure(*x), zip(*s))))
[docs] def to_dict(self): return {'class': (__name__, self.__class__.__name__), 'function': self.transfer_function_string}