pub struct NCP { /* private fields */ }Expand description
Neural Circuit Policy (NCP) wiring with biologically-inspired 4-layer architecture.
NCPs implement sparse, structured connectivity patterns inspired by the nervous system of C. elegans. This architecture provides:
- Parameter efficiency: Fewer synapses than fully-connected networks
- Interpretability: Clear information flow through defined layers
- Biological plausibility: Excitatory/inhibitory synapse types
§Architecture
NCPs organize neurons into 4 functional layers:
Sensory Inputs ──► Inter Neurons ──► Command Neurons ──► Motor Neurons
(input) (processing) (integration) (output)
│
└──► Recurrent connections§Layer Descriptions
| Layer | Role | Connectivity |
|---|---|---|
| Sensory | External inputs | → Inter (via sensory_fanout) |
| Inter | Feature extraction | → Command (via inter_fanout) |
| Command | Decision/integration | → Motor + self (recurrent) |
| Motor | Output neurons | ← Command (via motor_fanin) |
§Connectivity Parameters
sensory_fanout: How many inter neurons each input connects tointer_fanout: How many command neurons each inter neuron connects torecurrent_command_synapses: Number of command→command recurrent connectionsmotor_fanin: How many command neurons connect to each motor neuron
§Example
use ncps::wirings::{NCP, Wiring};
// Create NCP with explicit layer sizes
let mut wiring = NCP::new(
10, // inter_neurons: feature processing
8, // command_neurons: integration layer
4, // motor_neurons: output size
4, // sensory_fanout: each input → 4 inter neurons
4, // inter_fanout: each inter → 4 command neurons
6, // recurrent_command_synapses
4, // motor_fanin: each motor ← 4 command neurons
42, // seed for reproducibility
);
// Must build before use
wiring.build(16); // 16 input features
// Total neurons = inter + command + motor = 22
assert_eq!(wiring.units(), 22);
assert_eq!(wiring.output_dim(), Some(4));§Neuron ID Layout
Neurons are assigned IDs in this order:
[0..motor) [motor..motor+command) [motor+command..units)
Motor Command Inter§When to Use
Use NCP directly when you need fine-grained control over:
- Exact layer sizes
- Connectivity density (fanout/fanin parameters)
- Recurrent connection count
For automatic parameter selection, use AutoNCP instead.
§Panics
The constructor panics if constraints are violated:
motor_fanin > command_neuronssensory_fanout > inter_neuronsinter_fanout > command_neurons
Implementations§
Trait Implementations§
Source§impl Wiring for NCP
impl Wiring for NCP
Source§fn units(&self) -> usize
fn units(&self) -> usize
Returns the total number of neurons (hidden units) in this wiring. Read more
Source§fn input_dim(&self) -> Option<usize>
fn input_dim(&self) -> Option<usize>
Returns the input dimension (number of input features), or
None if not yet built. Read moreSource§fn output_dim(&self) -> Option<usize>
fn output_dim(&self) -> Option<usize>
Returns the output dimension (number of motor neurons). Read more
Source§fn num_layers(&self) -> usize
fn num_layers(&self) -> usize
Returns the number of logical layers in this wiring. Read more
Source§fn get_neurons_of_layer(&self, layer_id: usize) -> Vec<usize>
fn get_neurons_of_layer(&self, layer_id: usize) -> Vec<usize>
Returns the neuron IDs belonging to a specific layer. Read more
Source§fn get_type_of_neuron(&self, neuron_id: usize) -> &'static str
fn get_type_of_neuron(&self, neuron_id: usize) -> &'static str
Returns the type of a neuron by its ID. Read more
Source§fn build(&mut self, input_dim: usize)
fn build(&mut self, input_dim: usize)
Builds the wiring by setting the input dimension and creating sensory connections. Read more
Source§fn adjacency_matrix(&self) -> &Array2<i32>
fn adjacency_matrix(&self) -> &Array2<i32>
Returns the internal adjacency matrix representing neuron-to-neuron synapses. Read more
Source§fn sensory_adjacency_matrix(&self) -> Option<&Array2<i32>>
fn sensory_adjacency_matrix(&self) -> Option<&Array2<i32>>
Returns the sensory adjacency matrix (input-to-neuron connections). Read more
Source§fn add_synapse(&mut self, src: usize, dest: usize, polarity: i32)
fn add_synapse(&mut self, src: usize, dest: usize, polarity: i32)
Adds or modifies an internal synapse between two neurons. Read more
Source§fn add_sensory_synapse(&mut self, src: usize, dest: usize, polarity: i32)
fn add_sensory_synapse(&mut self, src: usize, dest: usize, polarity: i32)
Adds or modifies a sensory synapse from an input feature to a neuron. Read more
Source§fn get_config(&self) -> WiringConfig
fn get_config(&self) -> WiringConfig
Creates a serializable configuration for this wiring. Read more
Source§fn is_built(&self) -> bool
fn is_built(&self) -> bool
Returns
true if the wiring has been built (input dimension is set). Read moreSource§fn erev_initializer(&self) -> Array2<i32>
fn erev_initializer(&self) -> Array2<i32>
Returns the reversal potential initializer (same as adjacency matrix). Read more
Source§fn sensory_erev_initializer(&self) -> Option<Array2<i32>>
fn sensory_erev_initializer(&self) -> Option<Array2<i32>>
Returns the sensory reversal potential initializer. Read more
Source§fn synapse_count(&self) -> usize
fn synapse_count(&self) -> usize
Returns the total number of internal synapses (non-zero entries in adjacency matrix). Read more
Source§fn sensory_synapse_count(&self) -> usize
fn sensory_synapse_count(&self) -> usize
Returns the total number of sensory synapses (input-to-neuron connections). Read more
Source§fn input_required(&self) -> bool
fn input_required(&self) -> bool
Returns
true if this wiring requires external input (has sensory connections). Read moreAuto Trait Implementations§
impl Freeze for NCP
impl RefUnwindSafe for NCP
impl Send for NCP
impl Sync for NCP
impl Unpin for NCP
impl UnwindSafe for NCP
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more