diff --git a/src/py/calix/spiking/neuron.py b/src/py/calix/spiking/neuron.py index 565ed12205400144c7a7f7cc9ad8fe87ef51eeda..947627485b328fd4da1d5536ea84606bf16f4ee8 100644 --- a/src/py/calix/spiking/neuron.py +++ b/src/py/calix/spiking/neuron.py @@ -6,7 +6,6 @@ import numbers from typing import Optional, Union, List from dataclasses import dataclass from warnings import warn -from copy import deepcopy import numpy as np import quantities as pq @@ -95,27 +94,6 @@ class NeuronCalibTarget(base.CalibrationTarget): 0 * pq.ns, 4 * pq.us) } - @dataclass - class SyninParameters: - """ - Collection of parameters for synaptic input calibration. - - Contains boolean decisions that are set automatically based on - the shape of given targets: - - :ivar i_synin_gm: Target bias currents for synaptic input OTAs, - with shapes modified to match the needs of the calibration - routines. - :ivar calibrate_synin: Decide whether synaptic input OTA - strengths are calibrated. - :ivar equalize_synin: Decide whether excitatory and inhibitory - synaptic input strengths are equalized. - """ - - i_synin_gm: np.ndarray - calibrate_synin: bool - equalize_synin: bool - def check_types(self): """ Check whether parameters have the right types and shapes. @@ -175,36 +153,6 @@ class NeuronCalibTarget(base.CalibrationTarget): "Target synaptic time constant is out of allowed range " + "in the respective fit function.") - def prepare_synin(self) -> SyninParameters: - """ - Does preparations for synaptic input calibration. - - :return: SyninParameters class, containing desicions and - targets for synaptic input calibration. - """ - - i_synin_gm = deepcopy(self.i_synin_gm) - - if not isinstance(i_synin_gm, np.ndarray) \ - and np.ndim(i_synin_gm) > 0: - i_synin_gm = np.array(i_synin_gm) - if np.ndim(i_synin_gm) > 0 \ - and i_synin_gm.shape[-1] == halco.NeuronConfigOnDLS.size: - calibrate_synin = False - else: - calibrate_synin = True - if np.ndim(i_synin_gm) > 0 \ - and i_synin_gm.shape[0] \ - == halco.SynapticInputOnNeuron.size: - equalize_synin = False - else: - equalize_synin = True - i_synin_gm = np.array( - [i_synin_gm] * halco.SynapticInputOnNeuron.size) - - return self.SyninParameters( - i_synin_gm, calibrate_synin, equalize_synin) - NeuronCalibTarget.DenseDefault = NeuronCalibTarget( leak=np.ones( @@ -523,7 +471,6 @@ def calibrate( # process target target.check() - synin_parameters = target.prepare_synin() # create result object calib_result = _CalibrationResultInternal() @@ -560,12 +507,8 @@ def calibrate( connection, options, calib_result) # calibrate or configure CUBA synaptic input OTA biases - if synin_parameters.calibrate_synin: - neuron_calib_parts.calibrate_synaptic_input( - connection, synin_parameters, calib_result, target_cadc_reads) - else: - calib_result.i_syn_exc_gm = synin_parameters.i_synin_gm[0] - calib_result.i_syn_inh_gm = synin_parameters.i_synin_gm[1] + neuron_calib_parts.calibrate_synaptic_input( + connection, target, calib_result, target_cadc_reads) # calibrate syn. input references at final biases neuron_calib_parts.calibrate_synin_references( diff --git a/src/py/calix/spiking/neuron_calib_parts.py b/src/py/calix/spiking/neuron_calib_parts.py index 612d462df8f4ad98293eb25c7c04eb8797b6b13c..7d2855e9aa9ab3be628a100d6ca35230f8182061 100644 --- a/src/py/calix/spiking/neuron_calib_parts.py +++ b/src/py/calix/spiking/neuron_calib_parts.py @@ -25,6 +25,47 @@ if TYPE_CHECKING: from calix.spiking import neuron +class SyninParameters: + """ + Collection of parameters for synaptic input calibration. + + Contains decisions that are set automatically based on + the shape of targets for the calibration: + + :ivar i_synin_gm: Target bias currents for synaptic input OTAs, + with shapes modified to match the needs of the calibration + routines. + :ivar calibrate_synin: Decide whether synaptic input OTA + strengths are calibrated. + :ivar equalize_synin: Decide whether excitatory and inhibitory + synaptic input strengths are equalized. + """ + + def __init__(self, target: neuron.NeuronCalibTarget): + """ + :param target: Target parameters for neuron calib. + """ + + self.i_synin_gm = deepcopy(target.i_synin_gm) + + if not isinstance(self.i_synin_gm, np.ndarray) \ + and np.ndim(self.i_synin_gm) > 0: + self.i_synin_gm = np.array(self.i_synin_gm) + if np.ndim(self.i_synin_gm) > 0 \ + and self.i_synin_gm.shape[-1] == halco.NeuronConfigOnDLS.size: + self.calibrate_synin = False + else: + self.calibrate_synin = True + if np.ndim(self.i_synin_gm) > 0 \ + and self.i_synin_gm.shape[0] \ + == halco.SynapticInputOnNeuron.size: + self.equalize_synin = False + else: + self.equalize_synin = True + self.i_synin_gm = np.array( + [self.i_synin_gm] * halco.SynapticInputOnNeuron.size) + + def calibrate_tau_syn( connection: hxcomm.ConnectionHandle, tau_syn: np.ndarray, @@ -228,19 +269,27 @@ def finalize_synin_calib( def calibrate_synaptic_input( connection: hxcomm.ConnectionHandle, - synin_parameters: neuron.NeuronCalibTarget.SyninParameters, + target: neuron.NeuronCalibTarget, calib_result: neuron._CalibrationResultInternal, target_cadc_reads: np.ndarray): """ Run calibration of (current-based) synaptic inputs. :param connection: Connection to chip to run on. - :param synin_parameters: Parameters for synaptic input calibration. + :param target: Target parameters for neuron calibration. :param calib_result: Calibration result to store parameters in. :param target_cadc_reads: CADC samples at resting potential, with synaptic input disabled. """ + synin_parameters = SyninParameters(target) + + # return early if synaptic inputs are not to be calibrated + if not synin_parameters.calibrate_synin: + calib_result.i_syn_exc_gm = synin_parameters.i_synin_gm[0] + calib_result.i_syn_inh_gm = synin_parameters.i_synin_gm[1] + return + # Enable and calibrate excitatory synaptic input amplitudes to median neuron_helpers.reconfigure_synaptic_input( connection, excitatory_biases=synin_parameters.i_synin_gm[0])