Skip to main content

Spatial Gradient Implementation for Firing Thresholds

Overview​

This document describes the implementation of spatial gradients for neuron firing thresholds in FEAGI 2.0. This feature allows firing thresholds to vary across the spatial dimensions of a cortical area, enabling more sophisticated neural processing patterns.

Feature Description​

What is a Spatial Gradient?​

A spatial gradient allows the firing threshold of neurons to vary based on their 3D position (x, y, z) within a cortical area. The threshold for a neuron at position (x, y, z) is calculated as:

threshold(x, y, z) = base_threshold + (x × increment_x) + (y × increment_y) + (z × increment_z)

Where:

  • base_threshold: The firing threshold at position (0, 0, 0)
  • increment_x: Change in threshold per unit X position
  • increment_y: Change in threshold per unit Y position
  • increment_z: Change in threshold per unit Z position

Use Cases​

  1. Sensory Processing: Create receptive fields with varying sensitivity
  2. Spatial Attention: Implement position-dependent activation patterns
  3. Hierarchical Processing: Model cortical layers with different excitability
  4. Retinotopic Mapping: Simulate center-surround receptive fields
  5. Somatotopic Maps: Model body position-dependent sensitivity

Examples​

Example 1: Uniform Thresholds (No Gradient)​

base_threshold = 10.0
increment_x = 0.0
increment_y = 0.0
increment_z = 0.0

Result: All neurons have threshold = 10.0

Example 2: Linear X-Axis Gradient​

base_threshold = 10.0
increment_x = 2.0
increment_y = 0.0
increment_z = 0.0

For a 5×1×1 area:
- Neuron at (0,0,0): threshold = 10.0
- Neuron at (1,0,0): threshold = 12.0
- Neuron at (2,0,0): threshold = 14.0
- Neuron at (3,0,0): threshold = 16.0
- Neuron at (4,0,0): threshold = 18.0

Example 3: 3D Gradient​

base_threshold = 100.0
increment_x = 1.0
increment_y = 5.0
increment_z = 10.0

For a 2×2×2 area:
- (0,0,0): 100.0
- (1,0,0): 101.0
- (0,1,0): 105.0
- (1,1,0): 106.0
- (0,0,1): 110.0
- (1,0,1): 111.0
- (0,1,1): 115.0
- (1,1,1): 116.0

Example 4: Negative Gradient (Decreasing Sensitivity)​

base_threshold = 50.0
increment_x = -5.0
increment_y = 0.0
increment_z = 0.0

For a 3×1×1 area:
- Neuron at (0,0,0): threshold = 50.0
- Neuron at (1,0,0): threshold = 45.0
- Neuron at (2,0,0): threshold = 40.0

Implementation Details​

Modified Components​

1. Neuron Storage (feagi-npu/runtime)​

Files Modified:

  • src/traits/runtime.rs: Added threshold_limits() accessors to NeuronStorage trait
  • src/std_impl/neuron_array.rs: Added threshold_limits vector to StdNeuronArray
  • src/embedded_impl/neuron_array.rs: Added threshold_limits array to embedded NeuronArray

Changes:

  • add_neuron() and add_neurons_batch() signatures now accept threshold_limit parameter
  • Storage structures now maintain per-neuron threshold limits alongside thresholds

2. NPU Core (feagi-npu/burst-engine)​

Files Modified:

  • src/npu.rs: Updated create_cortical_area_neurons() to accept spatial gradient parameters
  • src/dynamic_npu.rs: Updated wrapper methods to pass gradient parameters
  • src/neural_dynamics.rs: Already implemented firing window logic (from previous feature)

Key Changes in npu.rs:

pub fn create_cortical_area_neurons(
&mut self,
cortical_idx: u32,
width: u32,
height: u32,
depth: u32,
neurons_per_voxel: u32,
default_threshold: f32, // Base threshold at (0,0,0)
threshold_increment_x: f32, // ✨ NEW
threshold_increment_y: f32, // ✨ NEW
threshold_increment_z: f32, // ✨ NEW
default_threshold_limit: f32,
// ... other parameters
) -> Result<u32>

Threshold Calculation Logic:

// Optimized: Check if we have any gradients
let has_x_gradient = threshold_increment_x.abs() > f32::EPSILON;
let has_y_gradient = threshold_increment_y.abs() > f32::EPSILON;
let has_z_gradient = threshold_increment_z.abs() > f32::EPSILON;
let has_any_gradient = has_x_gradient || has_y_gradient || has_z_gradient;

if has_any_gradient {
// Calculate position-based thresholds (spatial gradient)
for x in 0..width {
for y in 0..height {
for z in 0..depth {
let threshold_at_pos = default_threshold
+ (x as f32 * threshold_increment_x)
+ (y as f32 * threshold_increment_y)
+ (z as f32 * threshold_increment_z);

for _ in 0..neurons_per_voxel {
thresholds.push(T::from_f32(threshold_at_pos));
}
}
}
}
} else {
// Fast path: uniform thresholds
thresholds.resize(total_neurons, T::from_f32(default_threshold));
}

3. Brain Development (feagi-brain-development)​

Files Modified:

  • src/models/cortical_area.rs: Added accessor methods to CorticalAreaExt trait
  • src/connectome_manager.rs: Updated to extract and pass gradient parameters

New Trait Methods:

pub trait CorticalAreaExt {
fn firing_threshold_increment_x(&self) -> f32;
fn firing_threshold_increment_y(&self) -> f32;
fn firing_threshold_increment_z(&self) -> f32;
}

Implementation:

impl CorticalAreaExt for CorticalArea {
fn firing_threshold_increment_x(&self) -> f32 {
self.get_f32_property("firing_threshold_increment_x", 0.0)
}
// ... similar for y and z
}

Genome Configuration​

To use spatial gradients, add these properties to a cortical area in the genome JSON:

{
"cortical_areas": {
"my_cortical_area": {
"properties": {
"firing_threshold": 10.0,
"firing_threshold_increment_x": 1.0,
"firing_threshold_increment_y": 0.5,
"firing_threshold_increment_z": 0.0,
"firing_threshold_limit": 50.0
}
}
}
}

Property Defaults:

  • firing_threshold_increment_x: 0.0 (no X gradient)
  • firing_threshold_increment_y: 0.0 (no Y gradient)
  • firing_threshold_increment_z: 0.0 (no Z gradient)

If all increment values are 0.0 (default), all neurons get the firing_threshold value (backward compatible).

Performance Optimizations​

Fast Path for Uniform Thresholds​

When all increments are 0.0, the implementation uses a fast path:

thresholds.resize(total_neurons, T::from_f32(default_threshold));

This avoids the nested loop overhead and allows LLVM to vectorize the fill operation (SIMD).

Epsilon Comparison​

The implementation uses f32::EPSILON to check for zero increments:

let has_x_gradient = threshold_increment_x.abs() > f32::EPSILON;

This handles floating-point precision issues gracefully.

Neurons Per Voxel​

All neurons in the same voxel (same x,y,z position) receive the same threshold, which is correct behavior for spatial organization.

Testing​

Unit Tests​

A comprehensive test suite was added:

  • tests/test_spatial_gradient.rs in feagi-npu/burst-engine

Test Cases:

  1. 3D Gradient: Verifies correct threshold calculation across all three axes
  2. Uniform Thresholds: Ensures backward compatibility (no gradient)
  3. Single Axis Gradient: Tests X-only gradient
  4. Multiple Neurons Per Voxel: Confirms all neurons in a voxel share the threshold
  5. Negative Gradient: Tests decreasing thresholds

Integration Testing​

The feature was tested by:

  1. Successfully compiling the entire codebase
  2. Loading and processing test_genome.json
  3. Creating 104,513 neurons across 28 cortical areas
  4. Verifying no crashes or memory issues

Backward Compatibility​

✅ Fully backward compatible

  • Existing genomes without increment properties work unchanged (defaults to 0.0)
  • Uniform threshold behavior preserved when increments are 0.0
  • No changes to genome loading or API contracts

This implementation builds on the firing_threshold_limit feature, which defines the upper bound for firing:

Firing Window:

neuron fires if: threshold ≤ membrane_potential ≤ threshold_limit (if limit > 0)

Combined with spatial gradients, this creates position-dependent firing windows across a cortical area.

Future Enhancements​

Potential extensions to this feature:

  1. Non-linear Gradients: Quadratic, exponential, or Gaussian profiles
  2. Radial Gradients: Distance-based from a center point
  3. Custom Functions: User-defined threshold mapping functions
  4. Dynamic Gradients: Thresholds that change based on learning or plasticity
  5. Randomized Gradients: Stochastic variation around the spatial trend

Architecture Compliance​

✅ This implementation follows FEAGI 2.0 architecture principles:

  • No hardcoded values: All defaults come from genome properties
  • Cross-platform: Works with both StdRuntime and EmbeddedRuntime
  • Precision-agnostic: Supports both FP32 and INT8 quantization
  • SIMD-friendly: Fast path leverages vectorization
  • Memory efficient: Minimal overhead (3 f32 values per cortical area)
  • Deterministic: Same genome always produces same thresholds

References​

Modified Crates:

  • feagi-npu-runtime (v0.0.1-beta.1)
  • feagi-npu-burst-engine (v0.0.1-beta.1)
  • feagi-brain-development (v0.0.1-beta.1)

Commit Summary:

  • Added spatial gradient parameters to neuron creation pipeline
  • Implemented position-based threshold calculation
  • Added accessor methods to CorticalAreaExt trait
  • Maintained backward compatibility with existing genomes

Implementation Date: December 26, 2025
Status: ✅ Complete and Tested
Version: FEAGI 2.0.0-beta.1