Source code for brainpy._src.dyn.outs.base
from typing import Optional
import brainpy.math as bm
from brainpy._src.dynsys import DynamicalSystem
from brainpy._src.mixin import ParamDesc, BindCondData
__all__ = [
'SynOut'
]
[docs]
class SynOut(DynamicalSystem, ParamDesc, BindCondData):
"""Base class for synaptic outputs.
:py:class:`~.SynOut` is also subclass of :py:class:`~.ParamDesc` and :pu:class:`~.BindCondData`.
"""
def __init__(self,
name: Optional[str] = None,
scaling: Optional[bm.Scaling] = None):
super().__init__(name=name)
self._conductance = None
if scaling is None:
self.scaling = bm.get_membrane_scaling()
else:
self.scaling = scaling
def __call__(self, *args, **kwargs):
if self._conductance is None:
raise ValueError(f'Please first pack conductance data at the current step using '
f'".{BindCondData.bind_cond.__name__}(data)". {self}')
ret = self.update(self._conductance, *args, **kwargs)
return ret
def reset_state(self, *args, **kwargs):
pass
def offset_scaling(self, x, bias=None, scale=None):
s = self.scaling.offset_scaling(x, bias=bias, scale=scale)
if isinstance(x, bm.Array):
x.value = s
return x
return s
def std_scaling(self, x, scale=None):
s = self.scaling.std_scaling(x, scale=scale)
if isinstance(x, bm.Array):
x.value = s
return x
return s
def inv_scaling(self, x, scale=None):
s = self.scaling.inv_scaling(x, scale=scale)
if isinstance(x, bm.Array):
x.value = s
return x
return s