Skip to main content

sc_neurocore_engine/bindings/biophysical/
gif_population.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 — GIF population neuron PyO3 binding
8
9use pyo3::prelude::*;
10use pyo3::types::PyDict;
11
12use crate::neurons;
13
14#[pyclass(
15    name = "GIFPopulationNeuron",
16    module = "sc_neurocore_engine.sc_neurocore_engine"
17)]
18#[derive(Clone)]
19pub struct PyGIFPopulationNeuron {
20    inner: neurons::GIFPopulationNeuron,
21}
22
23#[pymethods]
24impl PyGIFPopulationNeuron {
25    #[new]
26    #[pyo3(signature = (seed=42))]
27    fn new(seed: u64) -> Self {
28        Self {
29            inner: neurons::GIFPopulationNeuron::new(seed),
30        }
31    }
32
33    fn step(&mut self, current: f64) -> i32 {
34        self.inner.step(current)
35    }
36
37    fn reset(&mut self) {
38        self.inner.reset();
39    }
40
41    fn get_state(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {
42        let state = PyDict::new(py);
43        state.set_item("v", self.inner.v)?;
44        state.set_item("theta", self.inner.theta)?;
45        state.set_item("eta", self.inner.eta)?;
46        Ok(state.into_any().unbind())
47    }
48}
49
50/// Register the GIF population neuron class.
51pub(super) fn register(module: &Bound<'_, PyModule>) -> PyResult<()> {
52    module.add_class::<PyGIFPopulationNeuron>()?;
53    Ok(())
54}