Skip to main content

sc_neurocore_engine/bindings/
rall_dendrite.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Commercial license available
3// © Concepts 1996–2026 Miroslav Šotek. All rights reserved.
4// © Code 2020–2026 Miroslav Šotek. All rights reserved.
5// ORCID: 0009-0009-3560-0851
6// Contact: www.anulum.li | protoscience@anulum.li
7// SC-NeuroCore — Rall dendrite PyO3 binding
8
9//! Python binding for the branched Rall cable-model simulator.
10
11use numpy::PyReadonlyArray1;
12use pyo3::prelude::*;
13
14use crate::rall_dendrite;
15
16/// Register the Rall dendrite simulator with the extension module.
17pub(crate) fn register(module: &Bound<'_, PyModule>) -> PyResult<()> {
18    module.add_class::<PyRallDendrite>()?;
19    Ok(())
20}
21
22#[pyclass(
23    name = "RallDendriteRust",
24    module = "sc_neurocore_engine.sc_neurocore_engine"
25)]
26pub struct PyRallDendrite {
27    inner: rall_dendrite::RallDendriteRust,
28}
29
30#[pymethods]
31impl PyRallDendrite {
32    #[new]
33    fn new(n_branches: usize, branch_length: usize, tau: f64, coupling: f64, dt: f64) -> Self {
34        Self {
35            inner: rall_dendrite::RallDendriteRust::new(
36                n_branches,
37                branch_length,
38                tau,
39                coupling,
40                dt,
41            ),
42        }
43    }
44
45    fn step(&mut self, branch_inputs: PyReadonlyArray1<'_, f64>) -> PyResult<f64> {
46        let inputs = branch_inputs.as_slice()?;
47        Ok(self.inner.step(inputs))
48    }
49
50    fn reset(&mut self) {
51        self.inner.reset();
52    }
53
54    #[getter]
55    fn soma_v(&self) -> f64 {
56        self.inner.soma_v
57    }
58}