Source code for spynnaker.pyNN.models.neuron.plasticity.stdp.common
# Copyright (c) 2014 The University of Manchester
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import math
import numpy
from numpy import uint16, uint32
from numpy.typing import NDArray
# Default value of fixed-point one for STDP
STDP_FIXED_POINT_ONE = (1 << 11)
[docs]
def float_to_fixed(value: float) -> int:
"""
:param float value:
:rtype: int
"""
return int(round(float(value) * STDP_FIXED_POINT_ONE))
[docs]
def get_exp_lut_array(time_step: float, time_constant: float,
shift: int = 0) -> NDArray[uint32]:
"""
:param float time_step:
:param float time_constant:
:param int shift:
:rtype: ~numpy.ndarray
"""
# Compute the actual exponential decay parameter
# NB: lambda is a reserved word in Python
l_ambda = time_step / float(time_constant)
# Compute the size of the array, which must be a multiple of 2
size = math.log(STDP_FIXED_POINT_ONE) / l_ambda
size, extra = divmod(size / (1 << shift), 2)
size = (int(size) + (extra > 0)) * 2
# Fill out the values in the array
a = numpy.exp((numpy.arange(size) << shift) * -l_ambda)
a = numpy.floor(a * STDP_FIXED_POINT_ONE)
# Concatenate with the header
header = numpy.array([len(a), shift], dtype=uint16)
return numpy.concatenate((header, a.astype(uint16))).view(uint32)