[docs]classStepTimeMixin:r"""Mixin for encoders with a base step time. Args: step_time (float): length of a simulation time step, in :math:`ms`. """def__init__(self,step_time:float):self.__step_time=argtest.gt("step_time",step_time,0,float)@propertydefdt(self)->float:r"""Length of the simulation time step, in milliseconds. Args: value (float): new simulation time step length. Returns: float: present simulation time step length. """returnself.__step_time@dt.setterdefdt(self,value:float)->None:self.__step_time=argtest.gt("dt",value,0,float)
[docs]classStepMixin(StepTimeMixin):r"""Mixin for encoders with a globally meaningful number of steps. Args: steps (int): number of steps over which to generate a spike train. """def__init__(self,steps:int,step_time:float):StepTimeMixin.__init__(self,step_time)self.__num_steps=argtest.gt("steps",steps,0,int)@propertydefsteps(self)->int:r"""Number of steps for which a spike train should be generated. Args: value (int): new number of steps over which to generate. Returns: int: present number of steps over which to generate. """returnself.__num_steps@steps.setterdefsteps(self,value:int)->None:self.__num_steps=argtest.gt("steps",value,0,int)@propertydefduration(self)->float:r"""Length of simulated time for which to generate a spike train, in milliseconds. Returns: float: length of simulation time for which to generate a spike train. """returnself.__num_steps*self.dt
[docs]classRefractoryStepMixin(StepMixin):r"""Mixin for encoders with a refractory period and a notion of global step. Args: steps (int): number of steps over which to generate a spike train. step_time (float): length of a simulation time step, in :math:`ms`. refrac (float): refractory period, in :math:`\text{ms}`. """def__init__(self,steps:int,step_time:float,refrac:float|None):# call superclass mixin constructorStepMixin.__init__(self,steps,step_time)# encoder attributesifrefracisNone:self.__derive_refrac=Trueself.__refrac_time=self.dtelse:self.__derive_refrac=Falseself.__refrac_time=argtest.gte("refrac",refrac,0,float)@propertydefdt(self)->float:r"""Length of the simulation time step, in milliseconds. Args: value (float): new simulation time step length. Returns: float: present simulation time step length. """returnStepMixin.dt.fget(self)@dt.setterdefdt(self,value:float)->None:StepMixin.dt.fset(self,value)ifself.__derive_refrac:self.__refrac_time=StepMixin.dt.fget(self)@propertydefrefrac(self)->float:r"""Length of the refractory period, in milliseconds. Args: value (float | None): new refractory period length, pins to the step time if ``None``. Returns: float: present refractory period length. """returnself.__refrac_time@refrac.setterdefrefrac(self,value:float|None)->None:ifvalueisNone:self.__derive_refrac=Trueself.__refrac_time=self.__step_timeelse:self.__derive_refrac=Falseself.__refrac_time=argtest.gte("refrac",value,0,float)
[docs]classGeneratorMixin:r"""Mixin for encoders with a random number generator. Args: generator (torch.Generator | None): random number generator to use. """def__init__(self,generator:torch.Generator|None):self.__rng=generator@propertydefgenerator(self)->torch.Generator|None:r"""PyTorch random number generator. Args: value (torch.Generator | None): new random number generator. Returns: float: present random number generator. """returnself.__rng@generator.setterdefgenerator(self,value:torch.Generator|None)->None:self.__rng=value