Skip to main content

Crate plasticity_lab

Crate plasticity_lab 

Source
Expand description

Reward-modulated SNN learning/training orchestration layer for the Limen-Neural stack.

This crate sits above neuromod::SpikingNetwork, which owns neuron/network dynamics, neuromodulator state, and the foundational classical and reward-modulated STDP primitives. plasticity-lab does not reimplement those primitives — it drives them through neuromod’s public API: single-step reward modulation via PlasticityTrainer::train_step and batch sessions via PlasticityTrainer::run_session (optional per-step telemetry via PlasticityTrainer::run_session_with_observer). Seeded replay uses PlasticityTrainer::train_step_with_rng / PlasticityTrainer::run_session_with_rng to inject a caller RNG into neuromod’s stochastic input encoding.

§Features

  • default — core loop only (neuromod + serde/thiserror/rand).
  • critic — optional dep on limbic-critic, plus the bridge adapter that converts critic limbic_critic::ModulatorVector into neuromod::NeuroModulators.

bridge and limbic_critic::ModulatorVector above are plain code spans, not doc links: both only exist with the critic feature enabled.

§Quick example

use neuromod::SpikingNetwork;
use plasticity_lab::{PlasticityTrainer, TrainingConfig, TrainingExample};
use rand::{rngs::StdRng, SeedableRng};

let mut trainer = PlasticityTrainer::new(TrainingConfig::default());
let mut network = SpikingNetwork::with_dimensions(4, 2, 8);
for neuron in &mut network.neurons {
    // `with_dimensions` intentionally creates blank weights. Seed the
    // documented L1 budget equally across input channels before training.
    neuron.weights.fill(2.0 / network.num_channels as f32);
}
let batch = vec![TrainingExample {
    stimuli: vec![1.0, 0.8, 0.6, 0.4, 0.2, 0.1, 0.05, 0.02],
    reward: 1.0,
}; 8];
let mut rng = StdRng::seed_from_u64(0x5EED);
let summary = trainer
    .run_session_with_rng(&mut network, &batch, &mut rng)
    .unwrap();
assert!(summary.total_spikes > 0);
assert!(summary.weight_drifts.iter().flatten().any(|delta| delta.abs() > 1e-5));

§Limbic bridge (critic)

use limbic_critic::SimpleCritic;
use plasticity_lab::bridge::{apply_modulator_vector, to_neuromodulators};

let vector = SimpleCritic::assess(&env);
let _ = apply_modulator_vector(&mut network, &stimuli, &vector);
// or: network.step(&stimuli, &to_neuromodulators(&vector));

See the crate README for the ecosystem map, scope/ownership boundaries (including the boundary with neuromod’s network dynamics and plasticity primitives), and common usage patterns.

Re-exports§

pub use config::TrainingConfig;
pub use observer::TrainingObserver;
pub use observer::TrainingStepEvent;
pub use trainer::PlasticityTrainer;
pub use trainer::SampleInvariant;
pub use trainer::TrainerError;
pub use trainer::TrainingExample;
pub use trainer::TrainingSummary;
pub use bridge::apply_modulator_vector;
pub use bridge::from_neuromodulators;
pub use bridge::to_neuromodulators;

Modules§

bridge
Bridge between limbic-critic modulator vectors and neuromod types.
config
observer
Per-step session observer types for crate::PlasticityTrainer::run_session_with_observer.
trainer