Skip to main content

RateEncoder

Struct RateEncoder 

Source
pub struct RateEncoder { /* private fields */ }
Expand description

Encodes analog values as spike rates based on input intensity.

Each input channel is mapped to a firing rate between base_rate and max_rate. In batch mode (encode), each call generates independent probabilistic spikes. In streaming mode (encode_step), accumulates expected spikes and fires deterministically when the accumulated value exceeds a threshold per channel.

§Mathematical Model

For batch encoding:

rate_hz = base_rate + normalized * (max_rate - base_rate)
probability = 1 - exp(-rate_hz * dt_seconds)
spike if random() < probability

For streaming (encode_step):

rate_hz = base_rate + normalized[i] * (max_rate - base_rate)
accumulator[i] += rate_hz * dt_seconds
spike if accumulator[i] >= 1.0 (then accumulator -= 1.0)

§When to Use

  • Converting continuous sensor values to spike rates
  • Poisson-like spike generation with controllable average rates
  • Real-time encoding where spike timing follows input intensity

§Parameters

  • base_rate: Minimum firing rate in hertz (Hz) when input is at range minimum
  • max_rate: Maximum firing rate in hertz (Hz) when input is at range maximum
  • range: Tuple of (min, max) input values
  • dt_seconds: Duration, in seconds, represented by each encode step

§Migration

RateEncoder::new keeps the previous constructor shape and uses dt_seconds = 0.1, which preserves the old deterministic / 10.0 increment for unit rates. Prefer RateEncoder::try_new for new code that wants explicit time-step configuration and validation.

§Examples

use axon_encoder::prelude::*;
let mut enc = RateEncoder::try_new(5.0, 100.0, (0.0, 1.0), 0.010)?;
let out = enc.encode(&[0.0, 0.5, 1.0]);
// Stochastic batch mode: at most one spike per channel.
assert!(out.spikes.len() <= 3);

Implementations§

Source§

impl RateEncoder

Source

pub const DEFAULT_DT_SECONDS: f32 = 0.1

Compatibility time step used by RateEncoder::new.

A 100 ms step makes rate_hz * dt_seconds equal to the previous deterministic / 10.0 increment for the same rate value.

Source

pub fn new(base_rate: f32, max_rate: f32, range: (f32, f32)) -> Self

Creates a rate encoder with the compatibility dt_seconds = 0.1.

Prefer RateEncoder::try_new when selecting an explicit sampling interval for new code.

§Panics

Panics if rates or range are invalid (dt_seconds is always the valid default 0.1, so callers cannot panic via the time step).

Source

pub fn try_new( base_rate: f32, max_rate: f32, range: (f32, f32), dt_seconds: f32, ) -> Result<Self, EncoderError>

Creates a rate encoder with an explicit time step in seconds.

Rates must be finite and non-negative with base_rate <= max_rate. dt_seconds must be finite and strictly positive. Range must be a non-degenerate finite f32 span (bounds finite, ordered, and max - min finite in f32).

Source

pub fn dt_seconds(&self) -> f32

Returns the configured time step in seconds.

Source

pub fn default_dt_seconds() -> f32

Source

pub fn encode_with_modulators( &mut self, input: &[f32], modulators: &NeuroModulators, gain_curves: &NeuromodulatorGainCurves, ) -> EncodedOutput

Encodes input using neuromodulator-driven gain curves.

Inherent wrapper so callers need not import ModulatedEncoder.

Source

pub fn encode_step_with_modulators( &mut self, input: &[f32], modulators: &NeuroModulators, gain_curves: &NeuromodulatorGainCurves, ) -> EncodedOutput

Step-wise variant of encode_with_modulators.

Uses the internal accumulator-based rate scale path for streaming.

Trait Implementations§

Source§

impl Clone for RateEncoder

Source§

fn clone(&self) -> RateEncoder

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RateEncoder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Encoder for RateEncoder

Source§

fn encode(&mut self, input: &[f32]) -> EncodedOutput

Encodes a slice of analog values into spike events (batch mode).
Source§

fn encode_step(&mut self, input: &[f32]) -> EncodedOutput

Encodes a single step incrementally (streaming mode). Read more
Source§

fn reset(&mut self)

Resets the encoder to its initial state
Source§

impl ModulatedEncoder for RateEncoder

Source§

fn encode_with_gains( &mut self, input: &[f32], gains: EncodingGains, ) -> EncodedOutput

Encodes input using already evaluated encoding gains. Read more
Source§

fn encode_step_with_gains( &mut self, input: &[f32], gains: EncodingGains, ) -> EncodedOutput

Encodes one streaming step using already evaluated encoding gains. Read more
Source§

fn encode_with_modulators( &mut self, input: &[f32], modulators: &NeuroModulators, gain_curves: &NeuromodulatorGainCurves, ) -> EncodedOutput

Encodes input using neuromodulator-driven gain curves.
Source§

fn encode_step_with_modulators( &mut self, input: &[f32], modulators: &NeuroModulators, gain_curves: &NeuromodulatorGainCurves, ) -> EncodedOutput

Encodes one streaming step using neuromodulator-driven gain curves.
Source§

impl PartialEq for RateEncoder

Source§

fn eq(&self, other: &RateEncoder) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for RateEncoder

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.