SparseFfn

Struct SparseFfn 

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

Sparse Feed-Forward Network computation.

This implements a two-layer FFN that can compute using only a subset of neurons:

  • W1: [hidden_dim, input_dim] - first projection (row-major for neuron access)
  • W2_T: [hidden_dim, output_dim] - second projection TRANSPOSED (row-major for contiguous access)
  • Activation function applied between layers

The sparse forward pass:

  1. Sparse first layer: only compute active neurons
  2. Apply activation function
  3. Sparse second layer: accumulate only active neuron contributions (now contiguous!)

§Performance Optimization

W2 is stored transposed so that accessing columns (by neuron index) becomes row access, which is contiguous in memory. This provides 15-25% speedup in the sparse accumulation step.

Implementations§

Source§

impl SparseFfn

Source

pub fn new( input_dim: usize, hidden_dim: usize, output_dim: usize, activation: ActivationType, ) -> Result<Self>

Create a new sparse FFN with given dimensions.

Source

pub fn from_weights( w1: Array2<f32>, w2: Array2<f32>, b1: Array1<f32>, b2: Array1<f32>, activation: ActivationType, ) -> Result<Self>

Create from existing weights.

Source

pub fn input_dim(&self) -> usize

Get input dimension.

Source

pub fn hidden_dim(&self) -> usize

Get hidden dimension.

Source

pub fn output_dim(&self) -> usize

Get output dimension.

Source

pub fn forward_sparse( &self, input: &[f32], active_neurons: &[usize], ) -> Result<Vec<f32>>

Compute FFN using only active neurons (sparse computation).

This is the main optimization: only compute activations for predicted neurons.

Source

pub fn forward_dense(&self, input: &[f32]) -> Result<Vec<f32>>

Compute FFN using all neurons (dense computation).

This is the baseline for comparison and correctness checking.

Trait Implementations§

Source§

impl Clone for SparseFfn

Source§

fn clone(&self) -> SparseFfn

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for SparseFfn

Source§

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

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

impl<'de> Deserialize<'de> for SparseFfn

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl FeedForward for SparseFfn

Source§

fn forward_sparse( &self, input: &[f32], active_neurons: &[usize], ) -> Result<Vec<f32>>

Sparse forward pass using only active neurons.
Source§

fn forward_dense(&self, input: &[f32]) -> Result<Vec<f32>>

Dense forward pass using all neurons.
Source§

impl Serialize for SparseFfn

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,