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 onlimbic-critic, plus thebridgeadapter that converts criticlimbic_critic::ModulatorVectorintoneuromod::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-criticmodulator vectors andneuromodtypes. - config
- observer
- Per-step session observer types for
crate::PlasticityTrainer::run_session_with_observer. - trainer